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 的精度與範圍較大,但兩者都無法精確表示所有十進位小數。