2010-10-08 69 views

回答

13

確實給出了預期的結果。你的期望是不正確的。

當您鍵入雙精度字面2.14656,你實際得到的是最接近的雙精度值,這就是:

2.14656000000000002359001882723532617092132568359375 

println恰好圓這個時候它打印出來(到17有意義的數字),所以你可以看到你期望的很好的價值。

模操作後(這是精確的),則該值是:

0.14656000000000002359001882723532617092132568359375 

再次,當它被印刷,這是圓形的,但因爲少了一個領先數字,圓點是一個數字更靠右,所以你看到尾隨2

+1

「這樣做會給出預期的結果,你的期望是不正確的。」應該居住在浮點行情名人堂! +1 – 2011-03-02 08:58:18

3

甲基-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等,然後四捨五入到合適的小數位數。滴答的數量,滴答大小的分子和分母都存儲在我們的數據庫中的整數。除了移動平均值等計算值之外,我們實際上並不存儲浮點值。

相關問題