かゆい所に手が届く解説

Pythonで正確な計算をするための「Decimal型」の使い方

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ライフを!

ABOUT ME
papa3
某教育機関で現役の講師をしながら、ブログとYouTubeでプログラミングの情報を発信しています。個人でもウェブアプリケーション開発と運営をしながら本業収入<副業を目指しています!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です