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 のほうが精度と範囲に優れますが、どちらもすべての十進小数を正確に表せるわけではありません。