2013-05-02 108 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代替。