PYTHON MEBY

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}")

関連記事