Pythonの標準ライブラリには、分数を扱える fractions
というモジュールがあります。これを使うことで、浮動小数点による丸め誤差の影響を回避できます。
以下はPythonインタプリタでの実行例です。通常、数学的に等しいはずの0.1 + 0.1 + 0.1 と 0.3 が異なる値になってしまいます。これは、0.1が2進数では割り切れないため、浮動小数点の丸め誤差が生じるからです。
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
>>> 0.1 + 0.1 + 0.1 == 0.3
False
このような丸め誤差を避けるために、fractions
モジュールを使って分数を扱うことができます。例えば、fractions.Fraction()
を使えば、以下のように期待通りの数学的に正しい式評価が可能です。
>>> from fractions import Fraction
>>> Fraction(1, 10) + Fraction(1, 10) + Fraction(1, 10)
Fraction(3, 10)
>>> Fraction(1, 10) + Fraction(1, 10) + Fraction(1, 10) == Fraction(3, 10)
True
浮動小数点による丸め誤差が怖いときは、分数を扱うことを念頭に置くとよさそう。