2014-01-07 163 views
-1

考慮以下代碼:C#精密計算乘以int和double

Console.WriteLine((197688 * 0.1) == 19768.800000000003); // True 
Console.WriteLine((197688 * 0.1) == 19768.8); // False 

是不正確的計算?

Java的>http://ideone.com/D3QsUo C# - >http://ideone.com/wp5pM9

+4

[什麼每臺計算機科學家應該知道關於浮點點算術](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Steve

+0

已經討論了很多次;浮點並不完美,您需要與delta進行比較。 –

回答

3

浮點類型(和計算)是性質不精確。他們工作在二進制,而不是十進制,因此計算產生「意想不到的」十進制值。

與此比較:

Console.WriteLine((197688 * 0.1m) == 19768.800000000003m); // False 
Console.WriteLine((197688 * 0.1m) == 19768.8m); // True 

結果是如你所期望的,因爲decimal使用。顧名思義,由於其內部表示,它適用於小數計算。

備註:經驗法則是從不使用浮點類型進行貨幣計算。確切地說,由於decical值的精度問題。

+1

另一個經驗法則是不要在浮點類型中使用'=='來避免陷入同樣的​​問題。 –

0

一個double只具有精度15-16位 - 編譯器將會把你的文字,以可以由double是這種情況表示最接近的值是19768.8