[英]Why are some floating point numbers accurately represented in C#?
受到這個問題的啟發,以下內容並沒有達到我的預期:
float myFloat = 0.6;
Console.WriteLine(myFloat);
// Output: 0.6
我希望上面打印出0.60000002384185791
( 0.6
的浮點表示) - 顯然這里有一些機制使得這個工作實際上它不應該(雖然你可以從鏈接的問題看到它有時不會不行
這個機制是什么?它是如何工作的?
如果你看一下Console.WriteLine
的實現,你會看到它最終使用默認的FormatProvider
調用ToString
。 即您看到的結果是使用此格式提供程序格式化時數字的顯示方式。
雖然它沒有解釋結果如何產生的細節,但它確實顯示Console.WriteLine
在打印之前會對值進行一些格式化。
我猜想,當將它轉換為字符串時,采用浮點數的WriteLine重載會進行舍入...
0.6不能用IEEE754浮點數表示。 它位於0.599999964237213134765625(0x3f199999)和0.600000083446502685546875(0x3f19999b)之間。 舍入到最近模式產生0.60000002384185791015625(0x3f19999a),這是WriteLine正在打印的內容。
您必須使用更高精度的浮點表示(雙精度)或限制WriteLine打印的小數位數:
float f = 0.6; Console.WriteLine("{0:N6}", f);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.