Code Fix

上級

0.1 + 0.2 が 0.3 にならない理由

浮動小数点数は2進数で正確に表現できない値があり、計算結果にわずかな誤差が生じます。==での比較はほぼ確実に失敗します。

なぜエラーが出ないのか

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

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

パターン1

 1  print(0.1 + 0.2 == 0.3           )
                       ^
出力: False期待: True (エラーにはなりません)

0.1や0.2は2進数では正確に表現できず、わずかな誤差を含みます。浮動小数点数の比較は==ではなく、差が十分小さいかどうかで判定します。

直し方: 0.1 + 0.2 == 0.3abs(0.1 + 0.2 - 0.3) < 1e-9 にします。

この問題を解いてみる →

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

パターン2

 1  total = 0.1 + 0.1 + 0.1
 2  print(total == 0.3           )
                     ^
出力: False期待: True (エラーにはなりません)

累積計算では誤差がさらに積み重なります。金額計算などで==比較をすると、理論上正しいはずの値が一致しないことがあります。

直し方: total == 0.3abs(total - 0.3) < 1e-9 にします。

この問題を解いてみる →

パターン3

 1  x = 1.1 - 1.0
 2  print(x == 0.1           )
                   ^
出力: False期待: True (エラーにはなりません)

引き算でも同じ誤差が発生します。金額や単位換算などfloatを使う場面では、常に許容誤差を使った比較を検討します。

直し方: x == 0.1abs(x - 0.1) < 1e-9 にします。

この問題を解いてみる →

よくある誤解

floatをより精度の高い型に変えても解決しません。2進小数で表現できないという根本的な制約は変わらないため、比較は常に許容誤差(イプシロン)を使って行います。

まとめ

0.1 + 0.2 が 0.3 にならない理由は上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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