Python で小数点を計算する際、思っていた結果と異なる場合があります。
この記事では、Python で小数点を扱うの際の注意点を理解し、その解決策として Decimal型 を利用する方法をご紹介します。
対象者は特に設定しませんが、初心者の方でも理解できるような解説です。
小数点の計算で困る場合
次の浮動小数点数を含んだ演算結果を確認しましょう。
print(0.2 * 6)
普通に考えると答えは「1.2」になりますね。
しかし、Python は内部的に数値を 2進数 で演算しているため、結果は「1.2000000000000002」となるのです。
1.2000000000000002
このように、10進数 の計算と違い、誤差が出てしまうのです。
例えば、次のスクリプトを実行したとき、結果は「True=同じ」になるはずです。
point = 0.2
count = 6
result = 1.2
if point * count == result:
print('同じ値です')
else:
print('違う値です')
しかし、実行すると、
違う値です
となります。
「0.2*6」と「1.2」は違うと判断されてしまいました。
ゲームの処理なんかで出てきそうな値ですが、この場合は「True = 同じ値です」になってほしいものです。
そこで、Decimal型 を使って解決する方法をご紹介しましょう。
Decimal型 とは?
通常、Python では浮動小数点数は 2進数 で扱われますが、Decimal型 は 10進数 で処理するための型です。
Decimal型 の値を生成するために、decimal モジュールをインポートする必要があります。
import decimal
あとは、Decimal 関数 に値を渡して変数に代入するだけ!
decimal モジュール内の Decimal 関数 を使うため、以下の様に記述します。
このとき、Decimal 関数 の(カッコ)内 = 引数には 10進数 として扱いたい値を「文字列で」記載します。
point = decimal.Decimal('0.2')
count = decimal.Decimal('6')
result = decimal.Decimal('1.2')
先ほどと同じように if文 で演算・比較すると、
if point * count == result:
print('同じ値です')
else:
print('違う値です')
10進数 で計算されるので正しい結果「同じ値です」が得られます。
同じ値です
※ここまでのコード全体を載せておきますね。
import decimal
point = decimal.Decimal('0.2')
count = decimal.Decimal('6')
result = decimal.Decimal('1.2')
if point * count == result:
print('同じ値です')
else:
print('違う値です')
Decimal関数 を使う際の注意点
Decimal型 の値を生成するときは、浮動小数点数の値を渡してはいけません。
どういうことかというと、上記の例では「’0.2’」のように「文字列」として Decimal関数 に値を渡しました。
このとき、「0.2」のように小数点として渡してしまうと、その時点で 2進数 なので Decilmal関数 を使う意味がなくなります。
〇:decimal.Decimal('0.2')
✕:decimal.Decimal(0.2)
この点は十分注意してください。
まとめ
今回はPythonで正確な計算をするための「Decimal型」の使い方をご紹介しました。
ポイントは「10進数で計算できるようにすること」です。
とても単純な例だったので、もしかしたら「具体的な使い道は?」と疑問に思うかもしれません。
もっと詳しく知りたいという方は、ぜひコメントやフォームでお問い合わせください。
Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。
それでは、ステキなPythonライフを!