簡體   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