System.out.println(2.14656);
2.14656爲什麼雙精度值的操作沒有給出預期的結果?
System.out.println(2.14656%2);
0.14656000000000002
跆拳道?
System.out.println(2.14656);
2.14656爲什麼雙精度值的操作沒有給出預期的結果?
System.out.println(2.14656%2);
0.14656000000000002
跆拳道?
確實給出了預期的結果。你的期望是不正確的。
當您鍵入雙精度字面2.14656
,你實際得到的是最接近的雙精度值,這就是:
2.14656000000000002359001882723532617092132568359375
的println
恰好圓這個時候它打印出來(到17有意義的數字),所以你可以看到你期望的很好的價值。
模操作後(這是精確的),則該值是:
0.14656000000000002359001882723532617092132568359375
再次,當它被印刷,這是圓形的,但因爲少了一個領先數字,圓點是一個數字更靠右,所以你看到尾隨2
。
「這樣做會給出預期的結果,你的期望是不正確的。」應該居住在浮點行情名人堂! +1 – 2011-03-02 08:58:18
甲基-2系統被用來存儲一個基數爲10號的任意精度。
當使用整數二進制數時,「舍入」數字是2,4,8,16,32,64等等。您將會注意到,這些中沒有一個是10,100,1000,10000或其他任何將被認爲是基數爲10的「圓」數字。
浮點和雙精度值是爲CPU內的快速操作而構建的。即使您將1.42E-13除以2.11E47,多個數字之間的數學運算也可以快速完成。它們不是爲了提供基數爲10的「圓」數字而構建的。這是該決定的副作用。
當使用浮點數時,您必須接受這會發生。這不是100%準確的,但是否則是準確的。所以你不應該在你需要100%精度的地方使用浮點變量。在你需要這樣做的地方,找到一種方法將它存儲在一個int值中。這也是一個好主意,在你使用浮點數的地方,將輸出四捨五入到小數位,以避免偶爾出現的顯示。
例如,我在金融行業工作,我們將市場價格表示爲多個價格而不是實際價格。當我們需要顯示一個價格時,我們將這個值乘以tick尺寸,1/100,1/32或1/20等,然後四捨五入到合適的小數位數。滴答的數量,滴答大小的分子和分母都存儲在我們的數據庫中的整數。除了移動平均值等計算值之外,我們實際上並不存儲浮點值。
浮點算術再次出現! [每個計算機科學家應該知道的關於浮點算術](http://docs.sun.com/source/806-3568/ncg_goldberg.html) – 2010-10-08 17:34:10