繁体   English   中英

双整数值溢出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM