我正在经历一些奇怪的情况。我使用Double parseDouble计算数字。在某些情况下,我得到额外的0,而不是109.1我得到... 109.10000001。
我正在尝试从json添加字符串。
这是我正在执行的代码行。
points = points + Double.parseDouble(x.points);
答案 0 :(得分:3)
Java使用IEEE浮点数作为其double
(和float
)数据类型。 double
具有很高的精度,但不是无限精度。有些数字只是近似值。
此外(没有双关语),添加这样的数字会使浮点错误复杂化。最终,错误足以引起注意,例如您的问题。
如果您可以接受性能影响,请使用BigDecimal
,这是任意精度。
答案 1 :(得分:1)
它可能与Double.parseDouble无关,而是浮点精度问题。浮点数和双精度数以二进制形式编码为尾数和指数。小数点后面的部分是一个特殊问题,因为在基数10中可以很容易地表示的内容不一定能在基数2中很好地表示。例如,十进制数0.2在二进制中变为无限重复,而非十进制中的1/3(0.333) ...)。我建议将四舍五入到固定的数字进行显示,或者使用java.math.BigDecimal代替。
答案 2 :(得分:0)
这实际上有一个非常复杂的答案,但基本上浮点数通常只是你给它的数字的近似值。
wikipedia的一个很好的例子是0.1,浮点数为0.009999999776482582092285156250。