2013-05-02 103 views
2

我正在運行奇怪的情況。我正在使用Double parseDouble對數字進行計數。在某些情況下,我得到額外的0,而不是109.1,我得到...... 109.10000001。Double parseDouble在添加數字時添加額外的0's

我想從json添加字符串。

這是我正在執行的代碼行。

points = points + Double.parseDouble(x.points); 

回答

3

Java使用IEEE浮點數其double(和float)數據類型。 A double有很多精度,但不是無限精度。有些數字只是近似值。另外(不是雙關語意思),像這樣的數字一起加起來就是浮點錯誤的組合。最終,這個錯誤已經足夠大了,比如你的問題在這裏。

如果您可以接受性能匹配,則使用BigDecimal,這是任意精度。

0

這實際上有一個非常複雜的答案,但實際上浮點數通常只是您給它的數字的近似值。

wikipedia的一個很好的例子是0.1,它在浮點數是0.009999999776482582092285156250。

1

它可能與Double.parseDouble無關,而是浮點精度問題。浮點數和雙精度以二進制編碼爲尾數和指數。小數點後面的部分是一個特殊的問題,因爲基數10中容易表示的內容不一定能在基數2中很好地表示。例如,十進制數0.2變成二進制無限重複,而非十進制中的1/3(0.333 ...)。我建議四捨五入到固定數量的數字進行顯示,或者使用java.math.BigDecimal代替。