Ruby ERROR
Ruby ZeroDivisionError の原因と解決法
整数を0で割ると発生するエラーです。空の配列でsizeを使って平均を出すときによく遭遇します。
このエラーメッセージ
ZeroDivisionError: divided by 0
原因
- 整数の割り算で割る数が0になっている
- 空の配列のsizeで割って平均を計算している
- ユーザー入力やDBの値をそのまま割る数に使っている
❌ エラーになるコード
NG
scores = [] # 空の配列
average = scores.sum / scores.size
puts average
✅ 修正したコード
OK
scores = []
average = scores.empty? ? 0 : scores.sum / scores.size
puts average
scores2 = [80, 90, 70]
puts scores2.sum / scores2.size
▶ 修正済みコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。
解決のポイント
割り算の前に割る数が0でないか確認します。配列ならempty?で空チェックするのがRubyらしい書き方です。なお、小数の割り算10.0 / 0はエラーにならずInfinityを返すため、整数か小数かで挙動が違う点にも注意しましょう。
よくある質問
10.0 / 0 がエラーにならないのはなぜ?
Float同士の除算はIEEE 754に従いInfinityを返す仕様だからです。ZeroDivisionErrorになるのは整数の除算です。
fdivやquoでも起きる?
fdivはFloatの除算なのでInfinityを返します。整数除算(/や%)とdivはZeroDivisionErrorになります。