HOWTO · Java
Java 中的 double 除法
說明 Java 整數除法為何會捨去小數部分,以及如何透過型別轉換或混合數值型別取得浮點數商。
本頁內容
在 Java 中,若要取得帶小數的商,必須在執行 / 運算前,先讓至少一個運算元成為浮點數。兩個 int 值相除會執行整數除法並捨去小數部分;事後再把結果指定給 double,也無法還原已捨去的小數。只要在除法前將其中一個運算元轉型為 (double) 即可;Java 會在這次運算中提升另一個運算元,但不會改變它原本的變數型別。
認識 Java 的整數除法
當兩個運算元都是整數型別時,Java 會執行整數除法。商會朝零截斷,因此 30 / 8 的結果是 3,而不是 3.75。截斷發生在運算式求值時,早於指定變數或列印結果。若你本來就不需要小數部分,例如計算整數個數,便可以使用整數除法。
以整數運算元取得 double 結果
在 / 運算前,先將任一運算元轉型,讓除法以浮點數方式執行。轉型會改變該運算元運算式的型別;接著,二元數值提升會在這次運算中轉換另一個運算元。原本的 int 變數仍然是 int。
執行以下完整範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
public class DivisionExample {
public static void main(String[] args) {
int numerator = 30;
int denominator = 8;
double quotient = (double) numerator / denominator;
System.out.println("Integer division: " + (numerator / denominator));
System.out.println("Cast before division: " + quotient);
System.out.println("Mixed operands: " + (numerator / 8.0));
System.out.println("Variable type remains int: " + (numerator));
}
}
Integer division: 3
Cast before division: 3.75
Mixed operands: 3.75
Variable type remains int: 30
第一行執行的是整數除法。在 / 前轉型,或使用 8.0 浮點數常值,都能得到帶小數的結果;numerator 則仍是 int。範例程式與輸出中的標籤維持英文,沒有翻譯。
混合數值型別的除法
若一個運算元是 double,另一個是 int,Java 會在除法運算中將 int 提升為 double,因此運算式的型別是 double。例如,30 / 8.0 會得到 3.75;原變數中的 30 仍是整數值。使用 float 運算元也會讓運算採用浮點數,但結果型別仍依二元數值提升規則決定:float 與 int 運算時結果是 float,float 與 double 混合運算時結果則是 double。
除法常見陷阱
- 除法後才轉型就太遲了。
(double) (30 / 8)會把已算出的整數3轉型,因此結果是3.0。應在除法前轉型:(double) 30 / 8。 - 指定結果的變數型別不會控制運算方式。
double quotient = 30 / 8;仍會先執行整數除法,因此quotient收到的是3.0。 - 依需求選擇
float或double。double的精度高於float;兩者都是二進位浮點數,某些十進位小數只能近似表示。若顯示時需要固定的小數位數,請在輸出時格式化數值。 - 除以零的行為取決於運算元型別。 整數除以零會擲出
ArithmeticException。浮點數除以零則遵循 IEEE 754:非零值除以0.0會得到無限大,而0.0 / 0.0會得到NaN。
常見問題
Java 用兩個 int 值相除會回傳什麼?
除法運算式的結果是整數,小數部分會因朝零截斷而捨去。例如,30 / 8 的結果是 3。
如何讓整數相除後得到 double 結果?
在除法前轉型其中一個運算元,例如 (double) numerator / denominator,或將其中一個運算元寫成浮點數常值。
可以用 int 除以 double 嗎?
可以。Java 會在這次運算中提升 int,使運算式的結果型別成為 double;原變數宣告的型別不會改變。
float 和 double 有什麼差別?
float 是 32 位元的 IEEE 754 二進位浮點數型別,double 則是 64 位元。一般而言,double 的精度與範圍較大,但兩者都無法精確表示所有十進位小數。