考慮以下代碼: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
考慮以下代碼: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
浮點類型(和計算)是性質不精確。他們工作在二進制,而不是十進制,因此計算產生「意想不到的」十進制值。
與此比較:
Console.WriteLine((197688 * 0.1m) == 19768.800000000003m); // False
Console.WriteLine((197688 * 0.1m) == 19768.8m); // True
結果是如你所期望的,因爲decimal
使用。顧名思義,由於其內部表示,它適用於小數計算。
備註:經驗法則是從不使用浮點類型進行貨幣計算。確切地說,由於decical值的精度問題。
另一個經驗法則是不要在浮點類型中使用'=='來避免陷入同樣的問題。 –
一個double
只具有精度15-16位 - 編譯器將會把你的文字,以可以由double
是這種情況表示最接近的值是19768.8
[什麼每臺計算機科學家應該知道關於浮點點算術](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Steve
已經討論了很多次;浮點並不完美,您需要與delta進行比較。 –