HOWTO · Java
Java 中的整數除法
本文說明 Java 整數除法如何處理正數、負數與餘數,以及如何透過型別轉換取得浮點數結果並安全處理除以零。
本頁內容
在 Java 中,整數除法會回傳整數商,並朝零截斷。兩個運算元都是 int 時,10 / 9 的結果是 1,而 10 / 19 的結果是 0;Java 不會將商四捨五入。若要取得餘數,請使用 %;若需要小數結果,請在相除前先將其中一個運算元轉換為 double。
整數除法的基本概念
以下完整的 Java 程式會印出四組 int 值相除所得的商:
public class IntegerDivision {
public static void main(String[] args) {
int first = 10 / 9;
int second = -10 / 9;
int third = 10 / -9;
int fourth = 10 / 19;
System.out.println(first);
System.out.println(second);
System.out.println(third);
System.out.println(fourth);
}
}
1
-1
-1
0
當兩個運算元都不為零時,恰有一個運算元為負數,商就會是負數。正商若小於 1,例如 10 / 19,會變成 0;-10 / 19 也會因為朝零截斷而變成 0。若被除數為零,只要除數不為零,商就是 0。
使用取模運算子處理餘數
% 運算子會回傳整數除法的餘數。若計算需要商與餘數兩者,可以搭配使用 / 和 %。對 Java 的帶正負號整數而言,餘數的正負號與被除數(左側運算元)相同;餘數也可能為零:
public class QuotientAndRemainder {
public static void main(String[] args) {
int dividend = -10;
int divisor = 3;
int quotient = dividend / divisor;
int remainder = dividend % divisor;
System.out.println("Quotient: " + quotient);
System.out.println("Remainder: " + remainder);
}
}
Quotient: -3
Remainder: -1
這些值符合 dividend == quotient * divisor + remainder:在此例中,-10 == (-3 * 3) + (-1)。這個特性可用於檢查整數是否為偶數,例如 number % 2 == 0。Java 的 % 常被稱為取模運算子;不過,遇到負數時應留意它採用的是帶正負號的餘數規則。
透過型別轉換保留精度
若要取得小數商,必須在計算 / 之前,先將至少一個運算元轉換為 float 或 double。型別轉換會讓運算改為浮點數除法:
public class FloatingPointDivision {
public static void main(String[] args) {
int numerator = 5;
int denominator = 2;
double result = (double) numerator / denominator;
System.out.println(result);
}
}
2.5
型別轉換發生在除法之前,因此 5 會先視為 double,商也就能保留小數部分。若在除法之後才轉換,例如 (double) (5 / 2),只會把已算出的整數 2 轉成 2.0,無法找回已捨去的小數部分。float 和 double 的二進位精度有限,因此許多十進位小數只能以近似值表示。一般用途通常使用 double 即可,且不要假設顯示結果一定有固定的小數位數。若需要精確的十進位算術,例如金額計算,請使用 BigDecimal,並明確指定小數位數與捨入規則。
整數除法的常見陷阱
整數除數為零時會引發 ArithmeticException。請在除法前檢查除數;若不適合先檢查,也可以在適當處理例外。以下是一個例子:
public class SafeDivision {
public static void main(String[] args) {
int numerator = 10;
int denominator = 0;
if (denominator == 0) {
System.out.println("Cannot divide by zero.");
} else {
System.out.println(numerator / denominator);
}
}
}
Cannot divide by zero.
當 denominator 來自使用者輸入或計算結果時,這項檢查尤其實用。整數除以零會在指派完成前引發例外。浮點數除法的規則不同:double 或 float 除以零會產生無限大或 NaN,而不是這裡的整數 ArithmeticException;若這些值對應用程式沒有意義,也應加以檢查。
另一個可能造成意外的情況與整數範圍有關:Integer.MIN_VALUE / -1 會溢位,結果仍是 Integer.MIN_VALUE。Java 不會針對這種溢位拋出例外。若數值可能接近型別上限,請改用範圍較大的型別,或在使用商之前驗證數值範圍。
結論
在 Java 中,整數 / 會朝零截斷,% 則會回傳帶正負號的餘數。若要取得浮點數商,請在除法前轉換其中一個運算元;整數除法則要先防止除數為零。
常見問題
int 除以零會怎麼樣?
Java 會拋出 ArithmeticException。請先檢查除數,或妥善處理這個例外。
如何取得小數結果?
在使用 / 之前,先將至少一個運算元轉換為 double 或 float。
如何取得餘數?
使用 %,例如:int remainder = dividend % divisor;。
可以在迴圈中使用整數除法嗎?
可以。請記得每次整數除法都會朝零截斷;如果迴圈計算需要小數,請使用浮點數運算元。