Java:计算返回错误的答案?

时间:2012-10-22 21:38:07

标签: java

  

可能重复:
  Retain precision with Doubles in java
  Moving decimal places over in a double

例如,像这样简单:

public class WrongAnswer {
  public static void main(String[] args) {
    System.out.println(100*1.1);
  }
}

打印110.00000000000001而不是110.使用其他数字而不是100 * 1.1也会给出很多数字,最后一些随机数字不对..

有什么想法吗?

4 个答案:

答案 0 :(得分:9)

浮点表示法的准确度有限。以下是指南:http://floating-point-gui.de/

答案 1 :(得分:4)

大多数浮点计算涉及舍入误差。在您的情况下,有两个舍入错误:转换(十进制)1.1到浮点(在IEEE 754浮点中没有精确的1.1表示 - 这是Java使用的)然后再乘以100.参见优秀文章{{ 3}}了解更多信息。

答案 2 :(得分:3)

100*1.11.1不合格,默认情况下为double,而100默认为int
因此,由于double的向上转换,乘法的结果也是100,这就是为什么你得到这个结果。

答案 3 :(得分:0)

正如所回答的那样,格式变得双倍。要打印closest int/long值,最好使用Math.round()函数:

 System.out.println(Math.round(100*1.1));

当您乘以更精确的数字时,这变得很重要,例如

    System.out.println(Math.round(100*1.199));  //--> prints 112
    System.out.println((int)(100*1.199)); //--> prints 111