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

Java 除法運算陷阱大揭秘:整數、浮點數、求餘完全指南

     編輯:Java 相關知識

除法看似簡單,實則暗藏陷阱。整數除以零拋異常、浮點數除以零得無窮大、NaN 自不相等、精度溢位……不知這些特性,代碼極易在邊界條件下失效。本文系統梳理 Java 除法與求餘的所有邊界行為,並給出安全編碼模式。

整數除法

  • 除數為 0:拋 ArithmeticException(運行時異常)
  • 結果截斷:向零取整(12/10 = 1、-12/10 = -1)
  • 混合運算:任一運算元為 float/double,整個表達式提升為浮點運算
System.out.println(12/10);    // 1
System.out.println(12f/10);   // 1.2
System.out.println(12/10.0);  // 1.2

浮點數除法(float/double)

遵循 IEEE 754 標準,除數為 0 不拋異常,而是返回特殊值:

運算式結果說明
非零 / 0.0Infinity正無窮大
非零 / -0.0-Infinity負無窮大
0.0 / 0.0NaN非數字
-0.0 / 0.0NaN非數字
0.0 / 非零±0.0帶符號零,符號同被除數

特殊值判斷方法

Double x = 1.0 / 0.0;
x.isInfinite()          // true
x == Double.POSITIVE_INFINITY  // true

Double y = 0.0 / 0.0;
y.isNaN()               // true
y == Double.NaN         // false!NaN != NaN
Double.isNaN(y)         // true 靜態方法正確

陷阱:NaN != NaN,必須用 isNaN() 或 Double.isNaN() 判斷。

常量定義揭示本質

POSITIVE_INFINITY = 1.0 / 0.0;
NEGATIVE_INFINITY = -1.0 / 0.0;
NaN = 0.0 / 0.0;

求餘運算(%)

  • 整數求餘:a % b 符號同被除數 a(23%-4 = 3、-23%4 = -3)
  • 浮點求餘:同樣遵循 IEEE 754,除數為 0 返回 NaN
23 % 4      // 3
23 % -4     // 3
-23 % 4     // -3
23.0 % 0.0  // NaN
0.0 % 0.0   // NaN

實戰安全模式

除法防護工具方法

public static double safeDiv(double dividend, double divisor, double defaultValue) {
    if (divisor == 0) return defaultValue;
    double result = dividend / divisor;
    if (Double.isInfinite(result) || Double.isNaN(result)) return defaultValue;
    return result;
}


財務/精度敏感場景

嚴禁使用 float/double,改用 BigDecimal:

BigDecimal a = new BigDecimal("1.2");
BigDecimal b = new BigDecimal("0.1");
BigDecimal result = a.divide(b, RoundingMode.HALF_UP); // 12

總結檢核表

  • ✅ 整數除法檢查除數非零
  • ✅ 浮點除法結果必檢 isInfinite()/isNaN()
  • ✅ NaN 比較只用 isNaN()
  • ✅ 金額計算用 BigDecimal
  • ✅ 求餘符號取決於被除數

掌握這些細節,讓數值計算代碼經得起邊界測試與生產考驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved