Code Fix

中級

剰余演算 % の符号がJavaと異なる理由

Pythonの%は除数の符号に合わせた結果を返します。Javaなど多くの言語は被除数の符号に合わせるため、負の数を扱うと結果が変わります。

なぜエラーが出ないのか

出力: 1
(エラーなし)
Pythonは何も報告しません。文法として正しいためです
出力: 1
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  x = -7
 2  y = 3
 3  remainder = abs(x) % y
                     ^
 4  print(remainder)
出力: 1期待: 2 (エラーにはなりません)

Pythonの%は除数の符号に合わせた結果を返します。abs()で絶対値にしてから計算すると、その正しい挙動を壊してしまいます。

直し方: abs(x) % yx % y にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  day = -3
 2  remainder = abs(day) % 7
                      ^
 3  print(remainder)
出力: 3期待: 4 (エラーにはなりません)

曜日を7で割った余りで表す場合も同じです。絶対値を取ってから割ると、負の日付が表す「巻き戻り」の意味が失われます。

直し方: abs(day) % 7day % 7 にします。

この問題を解いてみる →

パターン3

 1  hour = -2
 2  remainder = abs(hour) % 24
                       ^
 3  print(remainder)
出力: 2期待: 22 (エラーにはなりません)

24時間表記の巻き戻り計算でも同様です。Pythonの%はそのまま使えば正しく巻き戻ってくれるので、絶対値を取る必要はありません。

直し方: abs(hour) % 24hour % 24 にします。

この問題を解いてみる →

よくある誤解

他言語の経験から「結果は負になるはず」と考え、abs()で絶対値に変換してから計算すると、Pythonが本来返す正しい結果を壊してしまいます。

まとめ

剰余演算 % の符号がJavaと異なる理由は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)