可能的重复:
在java中使用双精度保持精度
将小数位移动到双精度
例如,像这样简单的事情:
public class WrongAnswer {
public static void main(String[] args) {
System.out.println(100*1.1);
}
}
打印 110.00000000000001 而不是 110。使用其他数字而不是 100*1.1 也会给出很多数字,最后是一些不正确的随机数字..
有任何想法吗?
可能的重复:
在java中使用双精度保持精度
将小数位移动到双精度
例如,像这样简单的事情:
public class WrongAnswer {
public static void main(String[] args) {
System.out.println(100*1.1);
}
}
打印 110.00000000000001 而不是 110。使用其他数字而不是 100*1.1 也会给出很多数字,最后是一些不正确的随机数字..
有任何想法吗?
浮点表示法的准确度有限。这是一个指南: http: //floating-point-gui.de/
大多数浮点计算都涉及舍入误差。在您的情况下,有两个舍入错误:将(十进制)1.1 转换为浮点(在 IEEE 754 浮点中没有 1.1 的精确表示 - 这是 Java 使用的),然后乘以 100。请参阅优秀文章What Every计算机科学家应该了解浮点运算以获取更多信息。
in100*1.1
是1.1
不合格的,所以默认情况下是double
while100
是默认情况下int
。
所以乘法的结果也是double
由于向上转换,100
这就是你得到这个结果的原因。
正如所回答的那样,它变成了双倍因此格式。要打印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