在Java中双重算术得到错误答案

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

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

换一种说法,

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

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

先感谢您。

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

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

输出:

 -4E-16 

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

*:显然,这个数字并不完全为零,但对于大多数现实世界的计算和计算而言,一个小的值不可忽视的。 以米为单位,该值小于质子和中子的直径 – 即非常小。 这就是我所说的“出于所有实际目的”。