可能重复:
双运算产生奇结果
我用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
秒。 它是由你来决定是否需要这种精度水平,并相应地做出选择。
*:显然,这个数字是不完全为零,但对于大多数现实世界中的计算和计算,值的小会不可小视。 在米,这个数值比质子和中子的直径 - 即非常非常小。 这就是我所说的“所有的实际目的”。