Javaで割り算は「/」、余りを計算する剰余山は「%」を使う。
このページではそれぞれの使い方の基本はもちろん、使う際の注意点に主題を置いてご紹介した。
割り算を使うときには知っておきたい話なので、サラッとでも読んでもらうといいだろう。
目次
Javaの割り算(除算)と剰余算の基本
Javaの割り算
まずは割り算だが、これは非常に簡単だ。下記でも解説しているが「/」を使えばいい。
演算結果の値 = 数字や変数 / 数字や変数;
ex.) x = 4 / 2;
などだ。わりとそのままな感覚だろうが、それで正しい。
Javaの剰余算
剰余算とは、割ったときの余りを計算するものだ。例えば「5 / 2 = 2 あまり1」というのは覚えがあるだろう。このときの「1」が剰余算の結果になる。
こちらはプログラム初心者の方にとっては少々変な気がするかもしれないが「%」を使う。他の言語に触ったことがある方は既におなじみだろう。
演算結果の値 = 数字や変数 % 数字や変数;
ex. ) x = 5 % 2
のように使う。
除算と剰余算を行う場合の注意点
Javaで除算や剰余算の計算を行うときは、注意しなければいけない約束事がある。この約束事に注意しないでプログラムを書くと、思わぬ間違いを起こしてしまうことになるので、気をつけなくてはいけない。例えば、いつもは正しく動く計算が、ある時突然おかしな計算結果を返してくると言うようなことが起きるのだ。
実際、どんな注意点があるのか見てみよう。
除算の丸め込み
整数の除算は、演算結果をゼロに向かって丸める。例えば、99を10で割れば、演算結果は9になる。つまり、9.9の小数点以下が切り捨てられる。マイナスの場合も同じだ。-99を10で割れば、-9になる。ゼロに近づく方向に切り捨てられる。これをゼロに向かって丸めるという。特に、乗算と組み合わせて演算を行うような場合は、注意が必要だ。
この点をサンプルプログラムで確認してみよう。
サンプルプログラム
このサンプルプログラムは99を10で割った演算結果を表示する、さらに、10を掛ける位置が割り算より左にあるか、それとも右にあるかによって計算結果に違いがあることも示している。丸め込みによる影響が出るからだ。
割り算に対して掛け算が右にあれば、丸められた後に掛け算が行われる。99 を10で割った演算結果9に10を掛けることになり、計算結果は90になる。一方、掛け算が左にあれば、99に10を掛けた990を10で割ることになる。演算結果は99になる。この違いを忘れないようにしよう。
1 2 3 4 5 6 7 8 9 10 11 |
public class DivisionRoundCaseOfInteger { public static void main (String[] args) { int result;//[1] result = 99 / 10;//[2] System.out.println("[3] 99/10 = " + result); result = 99 / 10 * 10;//[4] System.out.println("[5] 99/10*10 = " + result); result = 10 * 99 / 10;//[6] System.out.println("[7] 10*99/10 = " + result); } } |
実行結果
1 2 3 |
[3] 99/10 = 9 [5] 99/10*10 = 90 [7] 10*99/10 = 99 |
サンプルプログラムの説明
それでは少々丁寧すぎるくらいプログラムの解説をしてゆこう。
- [1] 変数resultを宣言する。
- [2] resultに99 / 10を代入する。
- [3] resultを表示する。
- [4] resultに99 / 10 * 10を代入する。
- [5] resultを表示する。
- [6] resultに10*99/10を代入する。
- [7] resultを表示する。
整数型の値の除算
整数の除算を行う場合の注意点には次のものがある。
- 整数型の値をゼロで除算するならば、例外(ArithmeticException)が発生する。例外については別の記事で解説しているので、参考にしてほしい。
- もし除算される値が最小の整数の値(マイナスの値)で除算する値が-1の場合、オーバーフローが起きて、結果は除算される値になる。このとき、例外は発生しない。
サンプルプログラム
では、この点をサンプルプログラムで見てみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class DivisionSpecialCaseOfInteger { public static void main (String[] args) { int plusValue10 = 10;//[1] int valueZero = 0;//[2] int minusValue1 = -1;//[3] int minusValue2 = -2;//[4] int result;//[5] try { result = plusValue10 / valueZero;//[6] System.out.println("[7] 10 / ゼロ" + result); } catch (ArithmeticException arithmeticException) {//[8] System.out.println("[9] 例外:ArithmeticException発生"); } System.out.println("[10] マイナス整数の最大値 = " + Integer.MIN_VALUE); result = Integer.MIN_VALUE / minusValue1;//[11] System.out.println("[12] マイナス整数の最大値 / -1 = " + result); result = Integer.MIN_VALUE / minusValue2;//[13] System.out.println("[14] マイナス整数の最大値 / -2 = " + result); } } |
実行結果
1 2 3 4 |
[9] 例外:ArithmeticException発生 [10] マイナス整数の最大値 = -2147483648 [12] マイナス整数の最大値 / -1 = -2147483648 [14] マイナス整数の最大値 / -2 = 1073741824 |
サンプルプログラムの説明
- [1] 変数plusValue10に10を代入する。
- [2] 変数minusValue1に-1を代入する。
- [3] 変数minusValue2に-2を代入する。
- [4] 変数valueZeroに0を代入する。
- [5] 変数resultを宣言する。
- [6] resultにplusValue10 / valueZeroを代入する。
- [7] resultを表示する。
- [8] 例外を受け取る。
- [9] 「例外:ArithmeticException発生」を表示する。
- [10] Integer.MIN_VALUEの値を表示する。
- [11] resultにInteger.MIN_VALUE / minusValue1を代入する。
- [12] resultを表示する。
- [13] resultにInteger.MIN_VALUE / minusValue2を代入する。
- [14] resultを表示する。
浮動小数点型の値の除算
浮動小数点型の値の除算を行う場合の注意点には次のものがある。
- ゼロをゼロで除算するならば、計算結果はNaN(Not a Number - 非数値)になる。また、ゼロでない値をゼロで除算するならば、符号付の最大値になる。
- 無限大の値を無限大の値で除算するならば、計算結果はNaNになる。
- 無限大の値を無限大ではない値で除算するならば、計算結果は符号付の無限大になる。
- 無限大ではない値を無限大の値で除算するならば、計算結果は符号付のゼロになる。
サンプルプログラム
では、この点をサンプルプログラムで見てみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class DivisionSpecialCaseOfDouble { public static void main (String[] args) { double valueZero = 0.0;//[1] double plusValue10 = 10.0;//[2] double result;//[3] result = valueZero / valueZero;//[4] System.out.println("[5] ゼロ / ゼロ = " + result); result = plusValue10 / valueZero;//[6] System.out.println("[7] 10.0 / ゼロ = " + result); result = Double.POSITIVE_INFINITY / Double.POSITIVE_INFINITY;//[8] System.out.println("[9] 正の無限大 / 正の無限大 = " + result); result = Double.POSITIVE_INFINITY / plusValue10;//[10] System.out.println("[11] 正の無限大 / 10.0 = " + result); result = Double.NEGATIVE_INFINITY / plusValue10;//[12] System.out.println("[13] 負の無限大 / 10.0 = " + result); result = plusValue10 / Double.POSITIVE_INFINITY;//[14] System.out.println("[15] 10.0 / 正の無限大 = " + result); } } |
実行結果
1 2 3 4 5 6 |
[5] ゼロ / ゼロ = NaN [7] 10.0 / ゼロ = Infinity [9] 正の無限大 / 正の無限大 = NaN [11] 正の無限大 / 10.0 = Infinity [13] 負の無限大 / 10.0 = -Infinity [15] 10.0 / 正の無限大 = 0.0 |
サンプルプログラムの説明
- [1] 変数valueZeroに0.0を代入する。
- [2] 変数plusValue10に10.0を代入する。
- [3] 変数resultを宣言する。
- [4] resultにvalueZero / valueZeroを代入する。
- [5] resultを表示する。
- [6] resultにplusValue10 / valueZeroを代入する。
- [7] resultを表示する。
- [8] resultにDouble.POSITIVE_INFINITY / Double.POSITIVE_INFINITYを代入する。
- [9] resultを表示する。
- [10] resultにDouble.POSITIVE_INFINITY / doublePlusValue10を代入する。
- [11] resultを表示する。
- [12] resultにDouble.NEGATIVE_INFINITY / doublePlusValue10を代入する。
- [13] resultを表示する。
- [14] resultにdoublePlusValue10 / Double.POSITIVE_INFINITYを代入する。
- [15] resultを表示する。
整数型の値の剰余算
整数の除算を行う場合の注意点には次のものがある。
- 除算されるある整数の値に対して除算する値がゼロであるならば、例外が発生する。
- 除算する値がゼロ以外の場合、いつでも正確な余りが求められる。これを、詳細に説明すると次のように言える。二項演算昇格の後の整数の剰余演算は、(a/b)*b+(a%b)はaと等しい演算結果になる。この同一性は、除算される値がその型の最大のマイナスの整数の値であり、除算する値が-1(剰余が0)であるという特別なケースにさえあてはまる。
サンプルプログラム
では、この点をサンプルプログラムで見てみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class RemainderSpecialCaseOfInteger { public static void main (String[] args) { int plusValue10 = 10;//[1] int valueZero = 0;//[2] int result;//[3] try { result = plusValue10 % valueZero;//[4] System.out.println("[5] 10 / ゼロ" + result); } catch (ArithmeticException arithmeticException) {//[6] System.out.println("[7] 例外:ArithmeticException発生"); } int a = 22;//[8] int b = 10;//[9] result = (a / b) * b + (a % b);//[10] System.out.println("[11] a = " + a); System.out.println("[12] (a/b)*b+(a%b) = " + result); a = Integer.MIN_VALUE;//[13] b = -1;//[14] result = (a / b) * b + (a % b);//[15] System.out.println("[16] a = " + a); System.out.println("[17] (a/b)*b+(a%b)=" + result); } } |
実行結果
1 2 3 4 5 |
[7] 例外:ArithmeticException発生 [11] a = 22 [12] (a/b)*b+(a%b) = 22 [16] a = -2147483648 [17] (a/b)*b+(a%b)=-2147483648 |
サンプルプログラムの説明
- [1] 変数plusValue10に10を代入する。
- [2] 変数valueZeroに0を代入する。
- [3] 変数resultを宣言する。
- [4] resultにplusValue10 % valueZeroを代入する。
- [5] resultを表示する。
- [6] 例外を受け取る。
- [7] 「例外:ArithmeticException発生」を表示する。
- [8] int a = 22;
- [9] int b = 10;
- [10] resultに(a / b) * b + (a % b)を代入する。
- [11] aを表示する。
- [12] resultを表示する。
- [13] 変数aにInteger.MIN_VALUEを代入する。
- [14] 変数bに-1を代入する。
- [15] resultに(a / b) * b + (a % b)を代入する。
- [16] aを表示する。
- [17] resultを表示する。
浮動小数点型の値の除算
浮動小数点型の値の剰余算を行う場合の注意点には次のものがあります。
- もし除算される値が無限大である、あるいは除算する値がゼロである、あるいはその両方であるならば、計算結果はNaN(Not a Number - 非数値)になる。
- もし除算される値が無限大ではない値であり、除算する値が無限大であるならば、計算結果は除算される値に等しい。
- もし除算される値がゼロであり、除算する値が無限大ではない値であるならば、計算結果は除算される値に等しい。
サンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class RemainderSpecialCaseOfDouble { public static void main (String[] args) { double valueZero = 0.0;//[1] double plusValue10 = 10.0;//[2] double result;//[3] result = Double.POSITIVE_INFINITY % plusValue10;//[4] System.out.println("[5] 無限大 % 10.0 = " + result); result = plusValue10 % valueZero;//[6] System.out.println("[7] 10.0 % ゼロ = " + result); result = Double.POSITIVE_INFINITY % valueZero;//[8] System.out.println("[9] 無限大 % ゼロ = " + result); result = plusValue10 % Double.POSITIVE_INFINITY;//[10] System.out.println("[11] 10.0 % 無限大 = " + result); result = valueZero % plusValue10;//[12] System.out.println("[13] ゼロ % 10.0 = " + result); } } |
実行結果
1 2 3 4 5 |
[5] 無限大 % 10.0 = NaN [7] 10.0 % ゼロ = NaN [9] 無限大 % ゼロ = NaN [11] 10.0 % 無限大 = 10.0 [13] ゼロ % 10.0 = 0.0 |
サンプルプログラムの説明
- [1] 変数valueZeroに0.0を代入する。
- [2] 変数plusValue10に10.0を代入する。
- [3] 変数resultを宣言する。
- [4] resultにDouble.POSITIVE_INFINITY % plusValue10を代入する。
- [5] resultを表示する。
- [6] resultにplusValue10 % valueZeroを代入する。
- [7] resultを表示する。
- [8] resultにDouble.POSITIVE_INFINITY % valueZeroを代入する。
- [9] resultを表示する。
- [10] resultにplusValue10 % Double.POSITIVE_INFINITYを代入する。
- [11] resultを表示する。
- [12] resultにvalueZero % plusValue10を代入する。
- [13] resultを表示する。
まとめ
このページではJavaの割り算と剰余算、それに伴う注意点についてまとめてお伝えした。
簡単な割り算とはいえ、コンピュータが計算するには色々と考慮すべき点が出てくる。注意して使っていくようにしよう。