Pythonで小数の計算を正確に行う方法

はじめに

次のようなコードがあったとしよう。

標準出力には、何が表示されるだろうか。

1
>>> print (0.03 - 0.02)

何を簡単な話を聞いているのか思うかもしれない。

答えは0.01ではなく、

1
2
>>> print (0.03 - 0.02)
0.009999999999999998

のようになる。

プログラムは(10進数の)小数を正確に表現することが難しいためである。

これはPythonに限った話ではない。

decimalモジュールの紹介

では、小数を正確に表現する手段が全くないかというと、そうでもない。

正確な表現が要求される場面では、そのためのモジュールを用いれば良い。

1
>>> from decimal import *

Pythonの場合、decimalモジュールを用いれば、正確な十進浮動小数点の表現ができ、正確な算術が行える。

1
2
>>> Decimal('0.03') - Decimal('0.02')
Decimal('0.01')

fractionsモジュールの紹介

有理数を正確に表現するためには、fractionsモジュールを用いれば良い。

1
>>> from fractions import Fraction

先の有限小数0.01も正確に表現できる上、

1
2
3
4
5
>>> Fraction(1, 100)
Fraction(1, 100)

>>> Fraction('0.01')
Fraction(1, 100)

無限小数も正確に表現できる。

1
2
>>> Fraction('1/3')
Fraction(1, 3)

Decimalインスタンスにも対応している。

1
2
>>> Fraction(Decimal('0.01'))
Fraction(1, 100)