Java:计算返回错误答案?
可能重复:Java:计算返回错误答案?,java,Java,可能重复: 例如,像这样简单的事情: public class WrongAnswer { public static void main(String[] args) { System.out.println(100*1.1); } } 打印110.00000000000001而不是110。使用其他数字而不是100*1.1也会给出很多数字,结尾有一些不正确的随机数字 有什么想法吗?在100*1.1中,1.1是不合格的,因此默认为double,而100默认为int 因此,乘
例如,像这样简单的事情:
public class WrongAnswer {
public static void main(String[] args) {
System.out.println(100*1.1);
}
}
打印110.00000000000001而不是110。使用其他数字而不是100*1.1也会给出很多数字,结尾有一些不正确的随机数字
有什么想法吗?在
100*1.1
中,1.1
是不合格的,因此默认为double
,而100
默认为int
因此,乘法的结果也是
double
,这是由于100
的上移,这就是为什么会得到这个结果 浮点表示法的精确度有限。这里有一个指南:大多数浮点计算都涉及舍入错误。在您的例子中,有两个舍入错误:将(十进制)1.1转换为浮点(IEEE 754浮点中没有精确的1.1表示形式——Java使用浮点),然后乘以100。有关更多信息,请参阅优秀文章。如回答所述,它将变为双倍格式。要打印最接近的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
欢迎来到神奇的浮点数世界,在这里,一切都是近似值,小数不重要。将强制转换复制到
int
碰巧在这里起作用,但只是出于偶然。在其他情况下,您可能会得到一个比您预期的少的结果。100.0d*1.1d给出相同的结果(110.00000000000001),但浮动没有问题:)100.0f*1.1f(110.0)这肯定不是“由于100的上移”。100是整数这一事实甚至与此无关。由于其中一个操作数是双精度的,计算总是以双精度进行。@EJP:为了使计算以双精度进行,两个操作数都应该是双精度的,这意味着100
首先被转换为double
,这是由于二进制数字提升的结果100
。但是由于1.1
是double
,因此100
被加宽以执行乘法。如果您打算执行乘法,请仔细阅读downvote@NegativeUser:请留下一些评论以了解问题。