在Java中使用双算术得到错误的答案

时间:2013-01-06 23:38:46

标签: java math floating-point double

  

可能重复:
  Double calculation producing odd result

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

换句话说,

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

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

提前谢谢。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

double值无法准确表示所有值,这就是一个例子。您可以改为使用BigDecimal

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

输出:

-4E-16