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