2012-05-04 85 views
1

我正在處理某些事情,並且遇到了一個我不明白的問題。除以100精度

double d = 95.24/(double)100; 
Console.Write(d); //Break point here 

控制檯輸出是0.9524(如預期),但如果我看向採空返回0.95239999999999991程序後,「d」。

我試過每一個可能的轉換,結果是一樣的。問題是我在別處使用'd',這個精度問題使我的程序失敗。

那麼它爲什麼這樣做呢?我該如何解決它?

+1

在SO –

+0

上有這麼多像這樣的浮點數問題猜測Double.ToString的默認格式只顯示4個第一位小數。如果你想要一個精確的表示(float和double不是精確的表示),你應該移動到十進制類型 –

回答

6

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

短的它是一個浮點數字存儲在什麼相當於2爲底的科學記數法。有一個整數有效位數被理解爲在小數點前面有一個位置,它被提升爲2的整數次冪。這允許以相對緊湊的格式存儲數字;缺點是從基數10到基數2的轉換會導致錯誤。

爲了緩解這種情況,無論何時需要在低幅度下的高精度,請使用decimal而不是double;十進制是一種128位浮點數類型,其設計精度非常高,代價是縮小了範圍(它只能表示數字高達+ - 79非零,7.9E28,而不是double的+ - 1.8E308;仍然很多用於大多數非天文學,非物理學計算機程序)和雙倍的內存佔用。

+0

+1回答他的問題 - 爲什麼以及如何解決 –

7

使用decimal而不是雙。

+0

它的工作!非常感謝 ! – PuK

1

你可以使用一個decimal代替:

decimal d = 95.24/100m; 
Console.Write(d); //Break point here 
1

嘗試:

double d = Math.Round(95.24/(double)100, 4); 

Console.Write(d); 

編輯:或者使用小數,是的。我只是試圖保持答案與問題類似:)