我正在用Java编写一个处理大量双算术的程序。我最终到了需要添加0.6666666666666666和-0.666666666666667的地步。但是,我得到的答案是-3.3306690738754696E-16。
换句话说,
double d1 = 0.6666666666666666;
double d2 = -0.666666666666667;
System.out.println(d1 + d2);
打印出“-3.3306690738754696E-16”。为什么会这样?
提前谢谢。
答案 0 :(得分:5)
double
并非完全准确,并非每个小数都可以完美地表示为double
(请参阅this)。出于所有实际目的,-3.3306690738754696E-16
为0
*。但是,如果您需要更高的精度,请使用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