四則演算と剰余

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

四則演算と剰余 とは

Java の + - * / % を使って、足し算・引き算・掛け算・割り算・剰余を扱えるようになろう。

プログラムで計算をする

コンピュータの最初の仕事は、その名のとおり「計算」でした。Java でも、人間が紙に書いて行う計算とほぼ同じ感覚で四則演算 (加減乗除) と剰余を扱えます。レジ袋の合計金額を出す、テストの平均点を計算する、ゲームの残り時間を求める、Web サイトの割引価格を表示する。私たちが普段書くプログラムの中には、数えきれないほどの「計算」が埋め込まれています。

算術演算は、変数や条件分岐と並んで、プログラミングのいちばん基本となる道具です。ここを軽く流すと、後で出てくる for ループや配列のインデックス計算でつまずきます。最初に丁寧に押さえておきましょう。

Java で使える 5 つの算術演算子

Java で使える基本の算術演算子は次の通りです。

  • + — 加算 (足し算)
  • - — 減算 (引き算)
  • * — 乗算 (掛け算)。記号は × ではなくアスタリスク *
  • / — 除算 (割り算)。記号は ÷ ではなくスラッシュ /
  • % — 剰余 (mod / 余り)。10 を 3 で割った余り 1 を返す

小学校の算数で習った記号 (× ÷) はキーボードに無いので、Java を含むほとんどのプログラミング言語では */ で代用するルールになっています。これは PythonJavaScript でも同じです。

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 % 3112 % 407 % 21 です。% は「偶数か奇数か」「3 の倍数か」「n 個ごとに何かする」など、プログラミングの多くの場面で出てきます。

Java

boolean isEven = (n % 2 == 0); // 偶数判定 boolean isMultipleOf3 = (n % 3 == 0); // 3 の倍数判定

演算子の優先順位

複数の演算子が混ざった式は、数学と同じ順番で計算されます。具体的には、掛け算と割り算が先、足し算と引き算が後です。

  • 優先順位 高 — * / %
  • 優先順位 低 — + -
  • 同じ優先順位の演算子は 左から右へ 順番に評価
  • カッコ () で囲むと、その中が最優先になる

例として 10 + 3 * 2 の評価順序を Mermaid で追ってみましょう。

diagram (will load when visible)

もし「先に 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 * 39 ではなく 7 です。「左から順番」と思い込んで計算するとズレます。迷ったらカッコを付けて自分の意図を明示しましょう

もうひとつ地味に多いのが、記号の打ち間違いです。*× と書いたり、/÷ と書いたりするとコンパイルエラーになります。半角の * / % を必ず使ってください。

エラーメッセージで ArithmeticException: / by zero が出たら、ほぼ確実にどこかでゼロ除算が起きています。エラーが指す行番号を見て、割り算の / か剰余の % の右側がゼロになっていないか確認しましょう。

やってみよう

それでは課題に挑戦してみましょう。今回のメソッドは calculate(int a, int b) です。

  1. 右側のエディタを開く
  2. まずは b != 0 の場合の式を書く。String result = "a + b = " + (a + b) + ", a - b = " + (a - b) + ", a * b = " + (a * b) + ", a / b = " + (a / b) + ", a % b = " + (a % b); のように、+ で文字列と数値を連結する
  3. 続いて if (b == 0) の分岐を足し、a / ba % b の部分を 0 に固定する
  4. 「実行」ボタンを押して、テストが緑になることを確認する

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 つができることを確認しましょう。

  1. 算術演算子 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 算術演算子 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は calculate、引数は int a, int b の 2 つ、戻り値の型は String にすること
  2. 出力フォーマットは "a + b = X, a - b = Y, a * b = Z, a / b = W, a % b = V" の形 (カンマの後ろは半角スペース 1 個、= の前後にも半角スペース)
  3. b == 0 の場合は a / ba % 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"

ヒント

main.java
main.java
学習モード

メモ

四則演算と剰余

⌘S で保存