7

可能的重复:
在java中使用双精度保持精度
将小数位移动到双精度

例如,像这样简单的事情:

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

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

有任何想法吗?

4

4 回答 4

9

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

于 2012-10-22T21:40:40.517 回答
4

大多数浮点计算都涉及舍入误差。在您的情况下,有两个舍入错误:将(十进制)1.1 转换为浮点(在 IEEE 754 浮点中没有 1.1 的精确表示 - 这是 Java 使用的),然后乘以 100。请参阅优秀文章What Every计算机科学家应该了解浮点运算以获取更多信息。

于 2012-10-22T21:41:36.107 回答
3

in100*1.11.1不合格的,所以默认情况下是doublewhile100是默认情况下int
所以乘法的结果也是double由于向上转换,100这就是你得到这个结果的原因。

于 2012-10-22T21:40:05.700 回答
0

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

 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
于 2012-10-22T21:47:27.557 回答