在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-16
为0
*。 但是,如果需要更高的精度,请使用BigDecimal
。 请记住,这种替代方案不会像使用原始double
s那样有效。 您可以自行决定是否需要此级别的准确度并做出相应的选择。
*:显然,这个数字并不完全为零,但对于大多数现实世界的计算和计算而言,一个小的值是不可忽视的。 以米为单位,该值小于质子和中子的直径 – 即非常小。 这就是我所说的“出于所有实际目的”。