3

我的情况很奇怪。我正在使用 Double parseDouble 计算数字。在某些情况下,例如我得到额外的 0 而不是 109.1,我得到... 109.10000001。

我正在尝试从 json 添加字符串。

这是我正在执行的代码行。

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

3 回答 3

4

Java 使用 IEEE 浮点数作为其double(和float)数据类型。Adouble有很多精度,但不是无限精度。有些数字只是近似值。

此外(没有双关语),将这样的数字加在一起会增加浮点错误。最终,错误大到足以引起注意,例如您的问题。

如果您可以接受性能损失,请使用BigDecimal,这是任意精度。

于 2013-05-02T23:55:15.713 回答
1

它可能与 Double.parseDouble 无关,而是浮点精度问题。浮点数和双精度数以二进制编码为尾数和指数。小数点后的部分是一个特殊的问题,因为可以很容易地以 10 为基数表示的东西不一定能以 2 为基数很好地表示。例如,十进制数 0.2 在二进制中变得无限重复,就像十进制中的 1/3(0.333 ...)。我建议四舍五入到固定位数进行显示,或者改用 java.math.BigDecimal。

于 2013-05-03T00:04:10.383 回答
0

这实际上有一个非常复杂的答案,但本质上浮点数通常只是你给它的数字的近似值。

维基百科的一个很好的例子是 0.1,浮点数是 0.009999999776482582092285156250。

于 2013-05-02T23:57:30.540 回答