HOWTO · Java
Java での整数除算
Java の整数除算が返す商、余りの求め方、小数の商を得る方法、ゼロ除算を避ける方法を、コード例とともに説明します。
このページの内容
Java で整数同士を除算すると、商はゼロに向かって切り捨てられます。両方が int 型なら、たとえば 10 / 9 は 1、10 / 19 は 0 です。Java は商を四捨五入しません。剰余を求めるには % を使い、小数を含む結果が必要なら、除算の前に少なくとも一方の値を double に変換します。
整数除算の基本
次の Java プログラムは、4組の 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 は有限の2進精度を使うため、多くの10進小数は近似値になります。一般的な計算では通常 double を使い、表示される小数桁数が常に一定だとは考えないでください。金額のような正確な10進演算には、スケールと丸め方針を明示して 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 をゼロで割ると、この整数の ArithmeticException ではなく、無限大または NaN が生成されます。アプリケーションでそれらが意味を持たない場合は、結果を確認してください。
別の注意点として、整数型の範囲によるオーバーフローがあります。Integer.MIN_VALUE / -1 は int の範囲を超えるため、結果は Integer.MIN_VALUE になります。このオーバーフローで Java は例外を投げません。型の上限に近い値があり得る場合は、より広い型を使うか、商に依存する前に値の範囲を検証してください。
まとめ
Java の整数除算では / が商をゼロに向かって切り捨て、% が符号付きの余りを返します。浮動小数点数の商を得るには除算前に値を変換し、整数の除数がゼロでないことを確認してください。
FAQ
int をゼロで割るとどうなりますか?
Java は ArithmeticException を投げます。除算前に除数を確認するか、例外を処理してください。
小数を含む結果を得るにはどうすればよいですか?
/ を適用する前に、少なくとも一方の値を double または float にキャストします。
余りを求めるにはどうすればよいですか?
% を使います。たとえば、int remainder = dividend % divisor; と書けます。
ループ内で整数除算を使えますか?
はい。ただし、各整数除算の結果はゼロに向かって切り捨てられます。ループ内の計算で小数が必要なら、浮動小数点数の値を使ってください。