【问题标题】:Java Glitch? Subtracting numbers?Java故障?减去数字?
【发布时间】:2011-11-11 20:20:40
【问题描述】:

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

我去解决这个表达式:3.1 - 7.1

我得到答案:-3.9999999999999996

这是怎么回事?

【问题讨论】:

  • 浮点运算是怎么回事。
  • 查看this 之类的内容以及大量其他内容。 (嘿,WECSSKAFPN 的文章去哪了?)
  • 这一定是最常见的编程问题。 ....

标签: java double subtraction


【解决方案1】:

可以在这里找到一个很好的解释。 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); 

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

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

将产生作为输出:

 0.29
  28  

这可能不是您一开始所期望的。

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      附: Google 如何对数字进行四舍五入

      【讨论】:

      • Java can't have an error??我从来没有遇到过没有错误的计算机系统......
      • 不,我的意思是简单的加法,就像说 5+5 会正确 6+5 不会,
      • 那是一个处理器,但我还是猜你是对的!
      【解决方案4】:

      浮点数的舍入误差

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

      【讨论】:

        【解决方案5】:

        自动类型提升正在发生,这就是结果。

        这里有一些学习资源。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-23
          • 2014-07-09
          • 2014-04-22
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多