1

可能重复:
双重计算产生奇数结果

我正在用 Java 编写一个处理大量双重算术的程序。我最终到了需要添加 0.6666666666666666 和 -0.666666666666667 的地步。但是,我得到的答案是 -3.3306690738754696E-16。

换句话说,

double d1 = 0.6666666666666666;
double d2 = -0.666666666666667;
System.out.println(d1 + d2);

打印出“-3.3306690738754696E-16”。为什么会这样?

先感谢您。

4

2 回答 2

6

doubles 不是完全准确的,并且不是每个小数都可以完美地表示为 a double(参见this)。出于所有实际目的,-3.3306690738754696E-160*。但是,如果您需要更高的精度,请使用BigDecimal. 请记住,这种替代方法不会像使用原始doubles 那样有效。由您决定是否需要此级别的准确性并相应地做出选择。

*:显然,这个数字并不完全是零,但对于大多数现实世界的计算和计算来说,这么小的值是微不足道的。以米为单位,这个值小于质子和中子的直径——即非常非常小。这就是我所说的“出于所有实际目的”。

于 2013-01-06T23:42:37.137 回答
1

doublevalues 不能精确地表示所有值,这就是一个例子。您可以BigDecimal改用:

BigDecimal bd1 = new BigDecimal("0.6666666666666666");
BigDecimal bd2 = new BigDecimal("-0.666666666666667");
System.out.println(bd1.add(bd2));

输出:

-4E-16
于 2013-01-06T23:43:11.947 回答