Python decimalの使い方

この記事のポイント

Pythonで正確な小数点計算を可能にするdecimalモジュールの機能と使い方について、初心者の方にもわかりやすく解説していきます。

この記事を読むことで、次の点が理解できるようになります。

  • 浮動小数点の誤差を解決する高精度計算機能
  • 基本的な使い方から実践的な活用方法
  • 金融計算や科学計算での精密な数値処理

以下の内容を順番に学んで、decimalモジュールを自在に使いこなせるようになりましょう。

目次

dateとは?

Pythonのdecimalは、通常の浮動小数点数で発生する計算誤差を解決するためのモジュールです。コンピューターは二進数で計算するため、0.1のような十進小数を正確に表現できません。たとえば0.1 + 0.2を計算すると、0.30000000000000004という結果になってしまいます。decimalモジュールを使用することで、このような誤差を避け、金融計算や科学計算で求められる正確な数値処理を実現できます。

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

基本構文

decimalモジュールの基本的な使い方を見てみましょう。まず、Decimalクラスをインポートして使用します。

# decimalモジュールを使った価格計算の例 from decimal import Decimal PRICE_STR = '10.50' TAX_RATE_STR = '0.08' def calculate_total(price_str: str, tax_rate_str: str) -> Decimal: price = Decimal(price_str) tax_rate = Decimal(tax_rate_str) total = price * (1 + tax_rate) return total def main(): total = calculate_total(PRICE_STR, TAX_RATE_STR) print(total) if __name__ == "__main__": main()

出力結果

11.3400

整数や文字列からDecimalオブジェクトを作成できます。浮動小数点数から直接作成すると元の誤差が残るため、文字列を使用することが推奨されます。

# Decimalのさまざまな作成方法を示すサンプル from decimal import Decimal PI_STR = '3.14' ANSWER_INT = 42 TUPLE_DECIMAL = (0, (3, 1, 4), -2) def create_decimals(): """Decimalの色々な生成方法""" d1 = Decimal(PI_STR) d2 = Decimal(ANSWER_INT) d3 = Decimal(TUPLE_DECIMAL) # タプル形式 return d1, d2, d3 def main(): d1, d2, d3 = create_decimals() print(f'd1: {d1}, d2: {d2}, d3: {d3}') if __name__ == "__main__": main()

出力結果

d1: 3.14, d2: 42, d3: 3.14

実用例

以下では、Pythonのdecimalの具体的な使用例を8つのパターンに分けて紹介します。実際の開発現場でよく使われるケースを中心に、コード例とその説明を詳しく解説していきます。各例では動物の名前や数量を使って、親しみやすく理解しやすい内容にしています。

基本的な四則演算

decimalを使った基本的な計算方法です。通常の浮動小数点数では誤差が生じる計算も正確に処理できます。

# decimalモジュールを使ったペットフード代の合計計算 from decimal import Decimal CAT_FOOD_PRICE = '2.35' DOG_FOOD_PRICE = '3.80' BIRD_FOOD_PRICE = '1.25' def calculate_total_cost(cat: str, dog: str, bird: str) -> Decimal: cat_food = Decimal(cat) dog_food = Decimal(dog) bird_food = Decimal(bird) total = cat_food + dog_food + bird_food return total def main(): total_cost = calculate_total_cost(CAT_FOOD_PRICE, DOG_FOOD_PRICE, BIRD_FOOD_PRICE) print(f'ネコ、イヌ、トリのエサ代合計: {total_cost}円') if __name__ == "__main__": main()

出力結果

ネコ、イヌ、トリのエサ代合計: 7.40円

このように、decimalを使用することで小数点計算での誤差を防ぎ、正確な金額計算が可能になります。

精度設定と丸め処理

計算精度を設定し、適切な丸め処理を行う方法です。getcontextを使って全体の設定を変更できます。

# decimalモジュールを使った平均体重の計算例 from decimal import Decimal, getcontext PRECISION = 4 RABBIT_WEIGHT_STR = '2.7854' HAMSTER_WEIGHT_STR = '0.1234' def calculate_average_weight(rabbit_str: str, hamster_str: str, precision: int) -> Decimal: getcontext().prec = precision rabbit = Decimal(rabbit_str) hamster = Decimal(hamster_str) average = (rabbit + hamster) / 2 return average def main(): average_weight = calculate_average_weight( RABBIT_WEIGHT_STR, HAMSTER_WEIGHT_STR, PRECISION ) print(f'ウサギとハムスターの平均体重: {average_weight}kg') if __name__ == "__main__": main()

出力結果

ウサギとハムスターの平均体重: 1.454kg

精度を4桁に設定することで、計算結果が適切に丸められて表示されます。

金融計算での活用

複利計算など、正確性が求められる金融計算での使用例です。わずかな誤差も許されない場面で威力を発揮します。

# decimalモジュールを使った複利計算の例 from decimal import Decimal PRINCIPAL_STR = '10000' # 元金(円) INTEREST_RATE_STR = '0.03' # 年利(3%) YEARS = 5 # 期間(年) def calculate_compound_amount(principal_str: str, rate_str: str, years: int) -> Decimal: """元金・年利・年数から複利計算を行い、最終金額を返す""" principal = Decimal(principal_str) rate = Decimal(rate_str) amount = principal * (1 + rate) ** years return amount def main(): total = calculate_compound_amount(PRINCIPAL_STR, INTEREST_RATE_STR, YEARS) print(f'{YEARS}年後のライオン保護基金: {total}円') if __name__ == "__main__": main()

出力結果

5年後のライオン保護基金: 11592.7407430000円

長期間の複利計算でも、decimalなら正確な計算結果を得ることができます。

文字列との相互変換

decimalオブジェクトと文字列の変換方法です。データベースやファイルとのやり取りで頻繁に使用されます。

# decimalモジュールを使った身長差の計算例 from decimal import Decimal ELEPHANT_HEIGHT_STR = '3.25' # ゾウの身長(m) GIRAFFE_HEIGHT_STR = '5.80' # キリンの身長(m) def calculate_height_difference(elephant_str: str, giraffe_str: str) -> Decimal: elephant = Decimal(elephant_str) giraffe = Decimal(giraffe_str) difference = giraffe - elephant return difference def main(): height_diff = calculate_height_difference(ELEPHANT_HEIGHT_STR, GIRAFFE_HEIGHT_STR) print(f'キリンとゾウの身長差: {height_diff}m') if __name__ == "__main__": main()

出力結果

キリンとゾウの身長差: 2.55m

文字列からDecimalオブジェクトを作成し、計算後に再び文字列に変換することで、データの受け渡しが簡単になります。

比較演算の活用

decimal同士の比較演算を使った条件分岐の例です。正確な比較判定により、適切な処理分岐を実現できます。

# decimalモジュールを使った動物の食事量比較例 from decimal import Decimal PANDA_BAMBOO_STR = '15.5' # パンダの竹消費量 (kg/日) KOALA_EUCALYPTUS_STR = '0.8' # コアラのユーカリ消費量 (kg/日) def compare_food_intake(panda_str: str, koala_str: str) -> str: panda = Decimal(panda_str) koala = Decimal(koala_str) if panda > koala * 10: return 'パンダの方が大食い' else: return 'コアラの方が大食い' def main(): result = compare_food_intake(PANDA_BAMBOO_STR, KOALA_EUCALYPTUS_STR) print(f'比較結果: {result}です') if __name__ == "__main__": main()

出力結果

比較結果: パンダの方が大食いです

decimalオブジェクト同士の比較では、浮動小数点の誤差に影響されない正確な判定が行われます。

数学関数との連携

decimalオブジェクトに対して数学的な操作を行う方法です。平方根や対数計算なども正確に実行できます。

# decimalモジュールを使った平方根計算の例 from decimal import Decimal, getcontext PRECISION = 10 TIGER_TERRITORY_STR = '25.0' # トラの縄張り面積 (平方km) WOLF_TERRITORY_STR = '16.0' # オオカミの縄張り面積 (平方km) def calculate_radius_from_area(area_str: str, precision: int) -> Decimal: getcontext().prec = precision area = Decimal(area_str) radius = area.sqrt() return radius def main(): tiger_radius = calculate_radius_from_area(TIGER_TERRITORY_STR, PRECISION) wolf_radius = calculate_radius_from_area(WOLF_TERRITORY_STR, PRECISION) print(f'円形縄張りの半径 - トラ: {tiger_radius}km, オオカミ: {wolf_radius}km') if __name__ == "__main__": main()

出力結果

円形縄張りの半径 - トラ: 5.0km, オオカミ: 4.0km

平方根計算も含めて、数学的な演算を正確に実行することができます。

コンテキスト設定の応用

個別の計算に対してコンテキストを設定し、異なる精度や丸めルールを適用する方法です。

# decimalモジュールを使った数字の丸め処理 from decimal import Decimal, localcontext, ROUND_HALF_UP BEAR_HONEY_STR = '12.3456' # クマのハチミツ量 (kg) PRECISION = 3 def round_honey_amount(honey_str: str, precision: int) -> Decimal: honey = Decimal(honey_str) with localcontext() as ctx: ctx.prec = precision ctx.rounding = ROUND_HALF_UP rounded = +honey return rounded def main(): rounded_honey = round_honey_amount(BEAR_HONEY_STR, PRECISION) print(f'クマのハチミツ量(小数点以下2桁): {rounded_honey}kg') if __name__ == "__main__": main()

出力結果

クマのハチミツ量(小数点以下2桁): 12.3kg

localcontextを使用することで、特定の計算にのみ異なる精度設定を適用することができます。

まとめ

Pythonのdecimalモジュールは、正確な小数点計算を実現するための強力なツールです。通常の浮動小数点数では避けられない計算誤差を解決し、金融システムや科学計算など、高い精度が求められる分野で活躍しています。

decimalの活躍する場面

  • 金融計算システムでの正確な利息計算
  • 会計ソフトウェアでの金額処理
  • 科学研究での高精度数値解析
  • 統計処理での正確な平均値算出
  • 価格計算システムでの税込み価格算出

覚えておきたいポイント

  • 文字列からのDecimal作成が推奨される理由
  • getcontextによる精度とRounding設定方法
  • localcontextを活用した部分的な設定変更
  • 通常の数値型との演算時の注意点
  • 文字列変換を活用したデータ処理手法

decimalモジュールを適切に活用することで、数値計算の信頼性を大幅に向上させることができます。特に商用システムを開発する際は、このモジュールの特徴を理解し、適切な場面で使用することが重要です。今回紹介した基本的な使い方から応用例まで、実際のプロジェクトでぜひ活用してみてください。正確な数値処理により、より信頼性の高いプログラムを作成することができるでしょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. Pythonのリファレンス記事一覧
  4. Python decimalの使い方