Pythonで十進数演算(decimal.Decimal)
この記事では、Pythonのdecimalモジュールを使用して十進数演算を行う方法について説明します。浮動小数点数の精度に関する問題を回避し、正確な計算を行うためのdecimal.Decimalクラスの使い方を学びます。
目次
decimal.Decimalクラスの概要
Pythonの`decimal`モジュールは、十進数の演算を正確に行うためのクラス`decimal.Decimal`を提供します。通常の浮動小数点数(float)は、内部的には二進数で表現されるため、小数点以下の桁数が限られています。そのため、`0.1 + 0.2 == 0.3`は真になりません。一方、`decimal.Decimal`クラスは、十進数を正確に表現し、桁数制限を超える演算も可能です。
from decimal import Decimal
# 通常の浮動小数点数
float_result = 0.1 + 0.2
print(f"float: {float_result}") # 出力: float: 0.30000000000000004
# Decimalクラス
decimal_result = Decimal('0.1') + Decimal('0.2')
print(f"Decimal: {decimal_result}") # 出力: Decimal: 0.3
Decimalの生成
Decimalオブジェクトは、文字列、整数、または浮動小数点数から生成できます。文字列で生成することを推奨します。
from decimal import Decimal
# 文字列から生成
dec1 = Decimal('1.23')
# 整数から生成
dec2 = Decimal(10)
# 浮動小数点数から生成
dec3 = Decimal(3.14159)
print(dec1, dec2, dec3)
基本的な演算
Decimalオブジェクトは、`+`, `-`, `*`, `/`などの標準的な算術演算をサポートしています。
from decimal import Decimal
dec1 = Decimal('1.23')
dec2 = Decimal('4.56')
print(dec1 + dec2) # 出力: 5.79
print(dec1 - dec2) # 出力: -3.33
print(dec1 * dec2) # 出力: 5.6088
print(dec1 / dec2) # 出力: 0.2697402597402597
丸め処理
`quantize()`メソッドを使って、特定の桁数に丸めることができます。
from decimal import Decimal, ROUND_HALF_UP
dec1 = Decimal('3.14159')
rounded = dec1.quantize(Decimal('0.01'), ROUND_HALF_UP)
print(rounded) # 出力: 3.14
コンテキスト
`decimal.getcontext()`メソッドを使用して、精度、丸め方法などのコンテキストを設定できます。
from decimal import Decimal, getcontext, ROUND_HALF_UP
getcontext().prec = 3 # 精度を3桁に設定
getcontext().rounding = ROUND_HALF_UP # 丸め方法を設定
dec1 = Decimal('3.14159')
print(dec1) #出力: 3.14
その他の機能
`decimal`モジュールには、その他の多くの機能があります。例えば、比較演算子、冪乗関数、対数関数などです。 詳細は公式ドキュメントを参照してください。
例:通貨計算
Decimalは、通貨計算に適しています。正確な金額を扱う必要がある場合に、浮動小数点数を避けて使用しましょう。
from decimal import Decimal, ROUND_HALF_UP
price = Decimal('12.99')
quantity = Decimal('3')
tax_rate = Decimal('0.08')
subtotal = price * quantity
tax = subtotal * tax_rate
total = subtotal + tax
# 小数点以下2桁に丸める
total = total.quantize(Decimal('0.01'), ROUND_HALF_UP)
print(f"Subtotal: {subtotal}")
print(f"Tax: {tax}")
print(f"Total: {total}")