読者です 読者をやめる 読者になる 読者になる

AutomA’s blog

Pythonキチガイを目指すブログ

【Python3】Decimalモジュールを使った、精度の高い小数点以下の数値計算

そろそろ雑談ばかりじゃなくて技術的なことを書いていこうと思った。

 

通常、小数を表現するときはfloat型を使うと思います。

普段はそれでもいいのですが、金融や会計の場面でこのデータ型を使ってはならない、という注意書きを見たことがある方もいるかもしれません。私はJavaの教科書で見ました。

 

floatやdoubleを使って計算をすると、微妙~~~な誤差が入り込んでしまうため、完璧に正確な計算が求められる状況ではこのデータ型は適さないのです。

 

float(0.1)  + float(0.2)
>> 0.30000000000000004

 

こんな感じに。なんでこうなるかは詳しくは知りませんが、コンピュータは数値を二進数で認識してるのが関係しているようです。

 

じゃあどうすればいいかというと、Pythonには標準ライブラリにDecimalという十進数の計算をするモジュールが用意されています。これを使いましょう。

 

これは、float型のような浮動小数点形式でありながら、10進数演算も可能なデータ型であるdecimal.Decimal型を使えるようにするモジュールです。

 

decimal.Decimal型は、整数、文字列、タプルから作ることができます。float型を使うときは、一度文字列に変換してから作りましょう。

 

# decimalモジュールをインポート
from decimal import *    

# decimal.Decimal型を用意
d1 = decimal.Decimal("0.1")

# float型の変数aを用意
a = float(0.2)

# aをint型に変換
b = str(a)

# int型をDecimal型に変換
d2 = decimal.Decimal(b)
print(d1 + d2)

>> 0.3

 

誤差のないきれいな小数を出力することができました。float型をstr型に変換する作業を忘れるとやっぱり誤差込みの数値が出るので気をつけましょう。

 

ただし、decimal.Decimal型を使った計算はfloat型に比べて圧倒的に処理が遅いので、このような誤差を許さない計算ではない限り、float型を使うことをお勧めします。

 

Pythonで会計や金融ソフトを作る予定がある方は是非参考にどうぞ。

間違ったことを伝えると大変なので、突っ込みどころを見つけたガチ勢の方はご教授願います。

それでは!