我正在運行奇怪的情況。我正在使用Double parseDouble對數字進行計數。在某些情況下,我得到額外的0,而不是109.1,我得到...... 109.10000001。Double parseDouble在添加數字時添加額外的0's
我想從json添加字符串。
這是我正在執行的代碼行。
points = points + Double.parseDouble(x.points);
我正在運行奇怪的情況。我正在使用Double parseDouble對數字進行計數。在某些情況下,我得到額外的0,而不是109.1,我得到...... 109.10000001。Double parseDouble在添加數字時添加額外的0's
我想從json添加字符串。
這是我正在執行的代碼行。
points = points + Double.parseDouble(x.points);
Java使用IEEE浮點數其double
(和float
)數據類型。 A double
有很多精度,但不是無限精度。有些數字只是近似值。另外(不是雙關語意思),像這樣的數字一起加起來就是浮點錯誤的組合。最終,這個錯誤已經足夠大了,比如你的問題在這裏。
如果您可以接受性能匹配,則使用BigDecimal
,這是任意精度。
這實際上有一個非常複雜的答案,但實際上浮點數通常只是您給它的數字的近似值。
wikipedia的一個很好的例子是0.1,它在浮點數是0.009999999776482582092285156250。
它可能與Double.parseDouble無關,而是浮點精度問題。浮點數和雙精度以二進制編碼爲尾數和指數。小數點後面的部分是一個特殊的問題,因爲基數10中容易表示的內容不一定能在基數2中很好地表示。例如,十進制數0.2變成二進制無限重複,而非十進制中的1/3(0.333 ...)。我建議四捨五入到固定數量的數字進行顯示,或者使用java.math.BigDecimal代替。