四則演算と剰余
四則演算と剰余 とは
Java の
+-*/%を使って、足し算・引き算・掛け算・割り算・剰余を扱えるようになろう。
プログラムで計算をする
コンピュータの最初の仕事は、その名のとおり「計算」でした。Java でも、人間が紙に書いて行う計算とほぼ同じ感覚で四則演算 (加減乗除) と剰余を扱えます。レジ袋の合計金額を出す、テストの平均点を計算する、ゲームの残り時間を求める、Web サイトの割引価格を表示する。私たちが普段書くプログラムの中には、数えきれないほどの「計算」が埋め込まれています。
算術演算は、変数や条件分岐と並んで、プログラミングのいちばん基本となる道具です。ここを軽く流すと、後で出てくる
forループや配列のインデックス計算でつまずきます。最初に丁寧に押さえておきましょう。
Java で使える 5 つの算術演算子
Java で使える基本の算術演算子は次の通りです。
+— 加算 (足し算)-— 減算 (引き算)*— 乗算 (掛け算)。記号は×ではなくアスタリスク*/— 除算 (割り算)。記号は÷ではなくスラッシュ/%— 剰余 (mod / 余り)。10 を 3 で割った余り1を返す
小学校の算数で習った記号 (× ÷) はキーボードに無いので、Java を含むほとんどのプログラミング言語では * と / で代用するルールになっています。これは Python や JavaScript でも同じです。
Java
public class Calc {
public static void demo() {
int sum = 10 + 3; // 13
int diff = 10 - 3; // 7
int product = 10 * 3; // 30
int quotient = 10 / 3; // 3 (整数同士の割り算)
int remainder = 10 % 3; // 1 (余り)
}
}+ - * までは中学校の数学のままです。引っかかりやすいのは / と % の 2 つなので、順番に見ていきます。
整数除算の落とし穴
ここが Java 初心者がもっとも驚くポイントです。int 同士の割り算は、小数点以下が容赦なく切り捨てられます。
Java
int a = 5 / 2; // 2.5 ではなく 2
int b = 7 / 2; // 3.5 ではなく 3
int c = 1 / 3; // 0.333... ではなく 0
int d = -5 / 2; // -2 (0 に近い側へ切り捨て)整数を整数で割ると、結果も
intになります。intには小数を入れる場所がないので、Javaは小数部分を捨てる選択をしているわけです。これは「バグ」ではなく「仕様」です。慣れるまでは「整数除算は冷たい」とでも覚えておきましょう。
もし小数まで欲しい場合は、片方を double にします。
Java
double a = 5.0 / 2; // 2.5
double b = 5 / 2.0; // 2.5
double c = (double) 5 / 2; // 2.5 (キャストで double に変換)一方、% は「割った余り」を返してくれる便利な演算子です。10 % 3 は 1、12 % 4 は 0、7 % 2 は 1 です。% は「偶数か奇数か」「3 の倍数か」「n 個ごとに何かする」など、プログラミングの多くの場面で出てきます。
Java
boolean isEven = (n % 2 == 0); // 偶数判定
boolean isMultipleOf3 = (n % 3 == 0); // 3 の倍数判定演算子の優先順位
複数の演算子が混ざった式は、数学と同じ順番で計算されます。具体的には、掛け算と割り算が先、足し算と引き算が後です。
- 優先順位 高 —
*/% - 優先順位 低 —
+- - 同じ優先順位の演算子は 左から右へ 順番に評価
- カッコ
()で囲むと、その中が最優先になる
例として 10 + 3 * 2 の評価順序を Mermaid で追ってみましょう。
もし「先に 10 + 3 を計算したい」場合は、人間がカッコを付ける必要があります。
Java
int a = 10 + 3 * 2; // 16 (3 * 2 が先)
int b = (10 + 3) * 2; // 26 (10 + 3 が先)
int c = 100 / 10 / 2; // 5 (左から: 100/10=10, 10/2=5)
int d = 100 / (10 / 2); // 20 (10/2=5, 100/5=20)カッコは「読みにくいから付けない」ではなく「読みやすくするために付ける」ものです。優先順位が頭に入っていても、
a + b * c - d / eのような式は、自分の意図をはっきりさせるためにa + (b * c) - (d / e)と書いた方が、3 ヶ月後の自分やレビュアーに優しい書き方になります。
よくある間違い
初心者がよくハマるポイントは次の 3 つです。
- 整数除算で小数を期待する —
int avg = (a + b) / 2;と書いて、平均が想定より 1 小さい、というのは定番の罠です。double avg = (a + b) / 2.0;のように、片方を小数にして回避しましょう - ゼロ除算で実行時エラー —
int x = 10 / 0;を実行するとArithmeticException: / by zeroが出てプログラムが落ちます。%も同様で10 % 0も例外になります。割る前にif (b != 0)でチェックするか、b == 0の場合の戻り値を決めておくのが安全です - 優先順位を勘違いする —
1 + 2 * 3は9ではなく7です。「左から順番」と思い込んで計算するとズレます。迷ったらカッコを付けて自分の意図を明示しましょう
もうひとつ地味に多いのが、記号の打ち間違いです。* を × と書いたり、/ を ÷ と書いたりするとコンパイルエラーになります。半角の * / % を必ず使ってください。
エラーメッセージで
ArithmeticException: / by zeroが出たら、ほぼ確実にどこかでゼロ除算が起きています。エラーが指す行番号を見て、割り算の/か剰余の%の右側がゼロになっていないか確認しましょう。
やってみよう
それでは課題に挑戦してみましょう。今回のメソッドは calculate(int a, int b) です。
- 右側のエディタを開く
- まずは
b != 0の場合の式を書く。String result = "a + b = " + (a + b) + ", a - b = " + (a - b) + ", a * b = " + (a * b) + ", a / b = " + (a / b) + ", a % b = " + (a % b);のように、+で文字列と数値を連結する - 続いて
if (b == 0)の分岐を足し、a / bとa % bの部分を0に固定する - 「実行」ボタンを押して、テストが緑になることを確認する
Java では "文字列" + 数値 を書くと、数値が自動的に文字列に変換されて連結されます。たとえば "a + b = " + 13 は "a + b = 13" になります。ただし "a + b = " + a + b と書くと、左から順に連結されて "a + b = 103" のような結果になってしまうので、(a + b) のようにカッコで囲んで「先に足し算」を明示してください。
最初は if で分岐するのが面倒に感じるかもしれませんが、b == 0 を放置すると ArithmeticException でプログラムが落ちます。実務でも「ゼロ除算回避」は必ず書く守りのコードなので、ここで体に染み込ませておきましょう。
計算ができるようになると、プログラムで表現できる世界が一気に広がります。次のレッスンでは、ここで学んだ算術演算を変数の更新と組み合わせて、もっと実用的なコードを書いていきます。
よくある質問
Q. 整数同士の割り算で小数を得るには?
A. Python は / で自動的に小数になります(5 / 2 → 2.5)。Java や C 系は両方を整数にすると切り捨てられるため、5.0 / 2 のように片方を浮動小数にするか (double)a / b でキャストしてください。整数の商だけ欲しいなら // や / と (int) の組み合わせを使います。
Q. 剰余 % は負の数だとどうなりますか?
A. Python は被除数の符号にかかわらず除数の符号に合わせるため、-7 % 3 は 2 になります。C 系や Java は -7 % 3 が -1 になります。負の数を扱う剰余演算(曜日計算など)は ((a % n) + n) % n のように補正するのが安全です。
Q. 演算子の優先順位はどう確認できますか?
A. * と / は + と - より優先されますが、悩んだら明示的にカッコを付けるのが事故防止に役立ちます。a + b * c と (a + b) * c の違いは典型的なバグの種です。レビュアーがすぐ意図を読み取れるよう、わずかに冗長でもカッコで囲むコーディングが好まれます。
次のレッスン
次は 税込価格を計算する で、Java の + - * / % を使って、足し算・引き算・掛け算・割り算・剰余を扱えるようになろう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 算術演算子 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 算術演算子 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はcalculate、引数はint a, int bの 2 つ、戻り値の型はStringにすること - 出力フォーマットは
"a + b = X, a - b = Y, a * b = Z, a / b = W, a % b = V"の形 (カンマの後ろは半角スペース 1 個、=の前後にも半角スペース) b == 0の場合はa / bとa % bの部分を0にし、ArithmeticExceptionを発生させないこと
入出力例
test-cases.txt
calculate(10, 3) → "a + b = 13, a - b = 7, a * b = 30, a / b = 3, a % b = 1"
calculate(8, 4) → "a + b = 12, a - b = 4, a * b = 32, a / b = 2, a % b = 0"
calculate(7, 0) → "a + b = 7, a - b = 7, a * b = 0, a / b = 0, a % b = 0"