Java Glitch?减去数字?

时间:2011-11-11 20:20:41

标签: java double subtraction

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

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

我得到答案:-3.9999999999999996

这里发生了什么?

5 个答案:

答案 0 :(得分:10)

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

  

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

double s=0;

for (int i=0; i<26; i++)
    s += 0.1;
System.out.println(s); 
     

类似地,乘以.1 * 26得到的结果不同于   将.1添加到自身26次。舍入错误变得更加严重   从浮点数转换为整数时,因为转换为   积分型丢弃非积分部分,即使是计算   “看起来像”他们应该有积分值。例如,   以下陈述:

  double d = 29.0 * 0.01;
  System.out.println(d);
  System.out.println((int) (d * 100));
     

将产生输出:

 0.29
  28  
     

这可能不是你最初可能会想到的。

有关详细信息,请参阅提供的参考资料。

答案 1 :(得分:2)

正如其他几个人所提到的,如果您想获得精确的十进制值,则不能指望double,例如:在实施货币申请时。你应该做的是仔细看看BigDecimal

BigDecimal a = new BigDecimal("3.1");
BigDecimal b = new BigDecimal("7.1");
BigDecimal result = a.subtract(b);
System.out.println(result);      // Prints -4.0

答案 2 :(得分:1)

计算机是100%所以在数学世界中是正确的,对普通人来说不是。 Java无法在特定数字上出错,因为它只是以相同方式运行但具有不同输入的代码!

P.S。谷歌如何围绕一个数字

答案 3 :(得分:1)

浮点舍入错误

3 * 0.1 != 0.3相同的方式(当它至少没有被编译器折叠时)

答案 4 :(得分:1)

正在进行自动类型推广,这就是结果。

这是一些需要学习的资源。

http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html

下一步是学习使用格式化程序将其格式化为给定的精度/要求。