首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 長整數運算陷阱:int 溢出導致除法結果錯誤的分析與解決

     編輯:Java 相關知識

現象重現

以下程式碼預期輸出 1000,實際卻輸出 5:

public class Change {
    public static void main(String[] args) {
        final long L1 = 24 * 60 * 60 * 1000 * 1000;
        final long L2 = 24 * 60 * 60 * 1000;
        System.out.println(L1 / L2); // 輸出 5
    }
}

原因分析

  1. 字面量預設為 int:所有數字字面量(24, 60, 1000)皆為 int 型別。
  2. 運算過程溢出:24 * 60 * 60 * 1000 * 1000 過程中超出 int 最大值(2,147,483,647),導致溢出變成負數或錯誤值。
  3. 最後才提升為 long:運算完成後結果才被指派給 long 變數,但此時資料已損毀。

正確寫法

在第一個因數加上 L 後綴,強制整個運算以 long 進行:

final long L1 = 24L * 60 * 60 * 1000 * 1000;
final long L2 = 24L * 60 * 60 * 1000;
System.out.println(L1 / L2); // 輸出 1000

最佳實務建議

  • 涉及大數字運算時,務必在第一個字面量加 L(或 f/d 對應 float/double)。
  • 即使結果變數是 long,中間運算仍遵循「運算元型別決定運算型別」規則。
  • 使用 IDE 靜態分析或編譯器警告(如 -Xlint:overflow)輔助檢測。

補充:長整數常見場景

// 毫秒轉天數
long days = System.currentTimeMillis() / (24L * 60 * 60 * 1000);

// 避免溢出的時間計算
long start = System.nanoTime();
// ... 執行任務
long elapsedMs = (System.nanoTime() - start) / 1_000_000L;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved