【Python超入門】decimalを使った浮動小数点数の算術演算

Pythonでは浮動小数点数の値を正確に計算することができるdecimalモジュールが用意されています。

「浮動小数点数の値を正しく計算したい」
「浮動小数点数の値を指定した桁数で正しく四捨五入したい」

そこで、今回はdecimalモジュールを使用した浮動小数点数の計算方法について、以下の内容を解説していきます。


【基礎】decimalモジュールとは
【基礎】浮動小数点数の計算
【基礎】Decimal()を使用した計算
【発展】decimalの注意点
【発展】quantize()で四捨五入する方法

この記事ではdecimalモジュールを使用した浮動小数点数の計算方法について詳しく解説していますので、ぜひ参考にしてください。

decimalモジュールとは

小数点を使うには(浮動小数点数)のfloat型があります。

浮動小数点数の計算をする場合、小数点数を計算するときや丸めるときに誤差が発生する場合があります。

このような問題を防ぐため、Pythonでは十進数の計算をするためのdecimalモジュールが用意されています。

decimalを使うにはdecimalモジュールをインポートする必要があります。

from decimal import *

次項ではそんなdecimalモジュールの使い方を見ていきましょう

decimalモジュールの使い方

float型で計算した場合

浮動小数点数の計算を行いたい場合、通常以下のように計算しがちです。

f1 = 0.1
f2 = 0.2

print(f1 + f2)

実行結果:

0.30000000000000004

しかし、実行結果からわかるように最後尾の桁によくわからない誤差の数値が入ってしまいます。

パソコンは数値は2進数で表現しますが、2進数では小数点を正確に表現することができないため、このような結果になってしまいます。

Decimal()を使用した計算

そこで、浮動小数点数を正しく計算を行いたい場合には十進数を正確に計算できるdecimalモジュールを使用する必要があります。

以下にdecimalモジュールを使用した小数点の計算方法を紹介します。

from decimal import Decimal

f1 = Decimal("0.1")
f2 = Decimal("0.2")

print(f1 + f2)

実行結果:

0.3

decimalモジュールを使用すれば正しく計算されていることがわかりますね!

なお、decimalモジュールで定義すると浮動小数点ではなく固定点少数として定義されます。

decimalの注意点

注意点としてDecimal型を扱う場合は「Decimal("0.1")」のように小数点を文字列型で定義する必要があります。

たとえば、Decimal()の引数で指定した小数点を文字列型で定義しなかった場合、

f1 = Decimal(0.1)
f2 = Decimal(0.2)

print(f1 + f2)

実行結果:

0.3000000000000000166533453694

このように微妙な誤差が発生してしまうことがわかりますね。

そのため、Decimal型として扱いたい場合は引数の小数点を文字列として定義するようにしましょう。

quantize()で四捨五入する方法

decimalモジュールのquantizeメソッドを使用することで、浮動小数点数を指定した桁数で丸めることができます。

quantizeメソッドの書き方:

Decimal("数値").quantize(Decimal("0"), rounding=ROUND_HALF_UP))

また、引数roundingにROUND_HALF_UPを指定することで繰り上げによる四捨五入を行うことができます。

以下のプログラムをご覧ください

from decimal import *

print(Decimal("123.45678").quantize(Decimal("0"),rounding=ROUND_HALF_UP))
print(Decimal("123.45678").quantize(Decimal("0.1"),rounding=ROUND_HALF_UP))
print(Decimal("123.45678").quantize(Decimal("0.01"),rounding=ROUND_HALF_UP))

print(Decimal("0.1").quantize(Decimal("0"),rounding=ROUND_HALF_UP))
print(Decimal("0.5").quantize(Decimal("0"),rounding=ROUND_HALF_UP))

実行結果:

123
123.5
123.46
0
1

このように通常の四捨五入同様に値が丸められることがわかりますね!

また、0.5の場合は1に丸められます。

Pythonの四捨五入については、以下の記事でも詳しく解説されています。

まとめ

ここではdecimalモジュールを使用した浮動小数点数の計算方法について、以下の内容で解説しました。

  • decimalモジュールとは
  • 浮動小数点数の計算
  • Decimal()を使用した計算
  • decimalの注意点
  • quantize()で四捨五入する方法

通常のfloat型による浮動小数点数の計算では正しく計算が行われないこと、decimalモジュールを使用すれば正しく計算が可能であることがわかりましたね!

もし、decimalモジュールの使い方を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。