我正在處理某些事情,並且遇到了一個我不明白的問題。除以100精度
double d = 95.24/(double)100;
Console.Write(d); //Break point here
控制檯輸出是0.9524(如預期),但如果我看向採空返回0.95239999999999991程序後,「d」。
我試過每一個可能的轉換,結果是一樣的。問題是我在別處使用'd',這個精度問題使我的程序失敗。
那麼它爲什麼這樣做呢?我該如何解決它?
我正在處理某些事情,並且遇到了一個我不明白的問題。除以100精度
double d = 95.24/(double)100;
Console.Write(d); //Break point here
控制檯輸出是0.9524(如預期),但如果我看向採空返回0.95239999999999991程序後,「d」。
我試過每一個可能的轉換,結果是一樣的。問題是我在別處使用'd',這個精度問題使我的程序失敗。
那麼它爲什麼這樣做呢?我該如何解決它?
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
短的它是一個浮點數字存儲在什麼相當於2爲底的科學記數法。有一個整數有效位數被理解爲在小數點前面有一個位置,它被提升爲2的整數次冪。這允許以相對緊湊的格式存儲數字;缺點是從基數10到基數2的轉換會導致錯誤。
爲了緩解這種情況,無論何時需要在低幅度下的高精度,請使用decimal
而不是double
;十進制是一種128位浮點數類型,其設計精度非常高,代價是縮小了範圍(它只能表示數字高達+ - 79非零,7.9E28,而不是double的+ - 1.8E308;仍然很多用於大多數非天文學,非物理學計算機程序)和雙倍的內存佔用。
+1回答他的問題 - 爲什麼以及如何解決 –
你可以使用一個decimal代替:
decimal d = 95.24/100m;
Console.Write(d); //Break point here
描述了很多很好的文章:What Every Computer Scientist Should Know About Floating-Point Arithmetic它不涉及到C#,而是在普通浮法算術。
嘗試:
double d = Math.Round(95.24/(double)100, 4);
Console.Write(d);
編輯:或者使用小數,是的。我只是試圖保持答案與問題類似:)
在SO –
上有這麼多像這樣的浮點數問題猜測Double.ToString的默認格式只顯示4個第一位小數。如果你想要一個精確的表示(float和double不是精確的表示),你應該移動到十進制類型 –