我试图理解下面代码的行为,我写这个代码来试验计算溢出。
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
我所理解的是: 可能是因为Integer溢出为:
Double.MAX_VALUE = 1.7976931348623157E308
Integer.MAX_VALUE = 2147483647
我不明白为什么值不同? 当返回类型的方法是double时,不应该自动将它转换为double?
答案 0 :(得分:8)
(2500000 - 0) * 250000 * (200 + 310)
是由int
文字和数字运算符组成的表达式,因此使用整数运算符进行计算,结果为int
,因此溢出(因为它仅限于Integer.MAX_VALUE
)。在方法返回之前,溢出的结果将转换为double
,但为时已晚。
当您在开头添加(double)
时,将(2500000 - 0)
强制转换为double
并避免数字溢出,因为现在所有运算符都是浮点运算符,导致{{1}价值。这类似于写作
double
答案 1 :(得分:0)
是和否。在返回时,它将其转换为double,但计算以整数格式完成,在达到最大值时,它再次从min值开始。因此,如果您执行INT_MAX + 1,您将获得INT_MIN,这就是为什么您得到负面结果的原因。
答案 2 :(得分:0)
当方法的返回类型为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
。