获取错误的答案在双运算在Java中[复制](Getting wrong answer in doub

2019-10-17 13:34发布

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

我用Java编写一个程序,有很多双算术的交易。 我最终得到的地方,我需要添加0.6666666666666666和-0.666666666666667点。 但是,我得到的答复是-3.3306690738754696E-16。

换一种说法,

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

打印出 “-3.3306690738754696E-16”。 这究竟是为什么?

先感谢您。

Answer 1:

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

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

输出:

-4E-16


Answer 2:

double s为不完全准确的,而不是每一个小数可以完美地表示为double (参见此 )。 对于所有的实际目的, -3.3306690738754696E-160 *。 但是,如果您需要更精确,使用BigDecimal 。 请记住,这种替代几乎不会为使用原始的高效double秒。 它是由你来决定是否需要这种精度水平,并相应地做出选择。

*:显然,这个数字是不完全为零,但对于大多数现实世界中的计算和计算,值的会不可小视。 在米,这个数值比质子和中子的直径 - 即非常非常小。 这就是我所说的“所有的实际目的”。



文章来源: Getting wrong answer in double arithmetic in Java [duplicate]