[英]Double Integer value overflow
我试图理解下面的代码的行为,我写的实验计算溢出。
public static void main(String[] args) {
System.out.println(getSomeValue());
System.out.println(getFixedSomeValue());
}
private static double getSomeValue() {
return (2500000 - 0) * 250000 * (200 + 310);
}
private static double getFixedSomeValue() {
return (double) (2500000 - 0) * 250000 * (200 + 310);
}
输出:
-9.9787264E8
3.1875E14
我所理解的是:可能是因为整数溢出:
Double.MAX_VALUE = 1.7976931348623157E308
Integer.MAX_VALUE = 2147483647
我不明白为什么值不同? 当方法的返回类型为double时,是否应该自动将其转换为double?
(2500000 - 0) * 250000 * (200 + 310)
是由int
文字和数字运算符组成的表达式,因此使用整数运算符进行计算,结果为int
,因此溢出(因为它仅限于Integer.MAX_VALUE
)。 溢出的结果在方法返回之前转换为double
,但为时已晚。
当您在开头添加(double)
时,将(2500000 - 0)
为double
并避免数字溢出,因为现在所有运算符都是浮点运算符,导致double
值。 这与写作类似
return (2500000.0 - 0) * 250000 * (200 + 310)
^ decimal point = double literal rather than int
是的,不是。 在返回时,它将其转换为double,但计算以整数格式完成,在达到最大值时,它再次从min值开始。 因此,如果您执行INT_MAX + 1,您将获得INT_MIN,这就是为什么您得到双重的否定结果。
当方法的返回类型为double时,是否应该自动将其转换为double?
它确实如此,也许不是你的意思。
private static double getSomeValue() {
return (2500000 - 0) * 250000 * (200 + 310);
}
是相同的:
private static double getSomeValue() {
int e = (2500000 - 0) * 250000 * (200 + 310);
return (double) e;
}
即表达式使用int
,然后在最后强制转换为double
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.