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

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

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

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


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

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

なお、Pythonの記事については、こちらにまとめています。

目次

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モジュールの使い方を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次