可能重复:
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也会给出很多数字,最后一些随机数字不对..
有什么想法吗?
答案 0 :(得分:9)
浮点表示法的准确度有限。以下是指南:http://floating-point-gui.de/
答案 1 :(得分:4)
大多数浮点计算涉及舍入误差。在您的情况下,有两个舍入错误:转换(十进制)1.1到浮点(在IEEE 754浮点中没有精确的1.1表示 - 这是Java使用的)然后再乘以100.参见优秀文章{{ 3}}了解更多信息。
答案 2 :(得分:3)
在100*1.1
中1.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