HOWTO · Java

Javaで小数の商を求める方法

整数-二重除算の混乱を解消する

このページの内容

Javaで小数を含む商を得るには、/ 演算の前に少なくとも一方のオペランドを浮動小数点数にします。2つの int 値を除算すると整数除算になり、小数部分は切り捨てられます。その結果を後から double に代入しても、失われた小数部分は戻りません。除算の前に一方のオペランドを (double) でキャストすれば十分です。この演算ではJavaがもう一方のオペランドも型変換しますが、その変数自体の型は変わりません。

Javaの整数除算の仕組み

両方のオペランドが整数型の場合、Javaは整数除算を行います。商はゼロ方向に丸められるため、30 / 8 の結果は 3.75 ではなく 3 です。この処理は代入や表示より前に、式の中で行われます。小数部分が不要で、個数を整数で求める場合などには整数除算を使います。

整数オペランドから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 になります。

よくある質問

2つの int 値を除算すると、Javaは何を返しますか?

除算式の結果は整数型になり、小数部分はゼロ方向への丸めによって切り捨てられます。たとえば、30 / 8 は 3 です。

整数値から double の結果を得るにはどうすればよいですか?

(double) numerator / denominator のように、除算の前に一方のオペランドをキャストするか、一方に浮動小数点リテラルを使います。

int を double で割れますか?

はい。Javaは演算のために int を昇格させ、式の結果を double にします。元の変数の宣言型は変わりません。

float と double の違いは何ですか?

float は32ビット、double は64ビットのIEEE 754二進浮動小数点型です。一般に double のほうが精度と範囲に優れますが、どちらもすべての十進小数を正確に表せるわけではありません。