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

fpe*_*ele 1 java math floating-point double

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

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

换一种说法,

double d1 = 0.6666666666666666;
double d2 = -0.666666666666667;
System.out.println(d1 + d2);
Run Code Online (Sandbox Code Playgroud)

打印出"-3.3306690738754696E-16".为什么会这样?

先感谢您.

ars*_*jii 6

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

*:显然,这个数字是不完全为零,但对于大多数现实世界中的计算和计算,值的那个小是不可小视的.以米为单位,该值小于质子和中子的直径 - 即非常小.这就是我所说的"出于所有实际目的".

  • @fpele:你觉得-3.3306690738754696E-16有多大?你看过双号表示吗?你熟悉科学记数法吗?你有没有看过任何东西? (2认同)