3秒でわかる
割り算の余りを求める演算子。偶数判定や n 個ごとの繰り返し、時刻の巡回計算など、値をぐるりと一周させたいときに必ず出てきます。
もう少し詳しく
どういうものか
剰余演算子は、割り算をしたときの余りを返す演算子です。多くの言語で記号は % を使い、13 % 5 は 3 になります。13 を 5 で割ると商が 2 で余りが 3 だからです。
割られる数を割る数で何回引けるか引き続けて、引ききれずに残った分が結果になる、と考えると挙動を追いやすくなります。
なぜ必要か
「割り切れるかどうか」を判定する道具が他に無いためです。偶数か奇数かは n % 2 が 0 かどうかで決まりますし、うるう年の判定、3 個ごとに改行する処理、リストの端まで行ったら先頭へ戻す循環、ハッシュ値を配列の長さに収める処理まで、余りひとつで書けます。時計が 12 を超えると 1 に戻るのも 12 で割った余りの世界です。
具体例
print(13 % 5) # 3
print(10 % 2) # 0 割り切れる
for i in range(1, 16):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
else:
print(i)
# リストを 3 個ずつ折り返して表示する
items = ["a", "b", "c", "d", "e"]
for i, v in enumerate(items):
end = "\n" if (i + 1) % 3 == 0 else " "
print(v, end=end)つまずきやすいところ
負の数の扱いが言語ごとに違います。Python は -7 % 3 が 2 を返しますが、C や Java、JavaScript は -1 を返します。Python は結果の符号を割る数に合わせ、C 系は割られる数に合わせるためです。負の値が入りうる計算で言語をまたいで移植すると、ここだけ答えが変わって不具合になります。
もうひとつは 0 での割り算です。n % 0 はゼロ除算エラーになるので、割る数が変数のときは 0 でないことを先に確かめる必要があります。JavaScript の % は小数にも使えて 5.5 % 2 が 1.5 になりますが、浮動小数点の誤差がそのまま乗るので金額計算には向きません。
似た用語との違い
| 演算 | Python での例 | 結果 |
|---|---|---|
| 通常の割り算 | 7 / 2 | 3.5 |
| 切り捨て除算 | 7 // 2 | 3 |
| 剰余 | 7 % 2 | 1 |
商と余りを同時に欲しい場合、Python には divmod(7, 2) があり (3, 1) を返します。
覚え方
/ が「何回分けられたか」、% が「分けたあとに手元に残ったか」です。割った数より小さい値しか出てこない、と覚えておくと結果の見当を付けられます。