Java Glitch?减去数字?

Con*_*ure 5 java double subtraction

这是Java中的一个小故障吗?

我去解决这个问题:3.1 - 7.1

我得到答案:-3.9999999999999996

这里发生了什么?

Kev*_*sco 10

这里可以找到一个很好的解释.http://www.ibm.com/developerworks/java/library/j-jtp0114/

浮点运算很少精确.虽然一些数字(例如0.5)可以精确地表示为二进制(基数2)十进制(因为0.5等于2-1),但其他数字(例如0.1)不能.因此,浮点运算可能会导致舍入错误,从而产生一个接近 - 但不等于 - 您可能期望的结果的结果.例如,下面的简单计算结果为2.600000000000001,而不是2.6:

double s=0;

for (int i=0; i<26; i++)
    s += 0.1;
System.out.println(s); 
Run Code Online (Sandbox Code Playgroud)

类似地,乘以.1*26得到的结果不同于将.1加到自身26次的结果.当从浮点数转换为整数时,舍入误差变得更加严重,因为转换为整数类型会丢弃非整数部分,即使对于"看起来像"它们应该具有整数值的计算也是如此.例如,以下语句:

  double d = 29.0 * 0.01;
  System.out.println(d);
  System.out.println((int) (d * 100));
Run Code Online (Sandbox Code Playgroud)

将产生输出:

 0.29
  28  
Run Code Online (Sandbox Code Playgroud)

这可能不是你最初可能想到的.

有关更多信息,请参阅提供的参考.