Pythonの10進数(decimalモジュール)関数とは?主要関数の使い方を実例付きで解説
Pythonでは、正確な10進浮動小数点演算を実現するために、標準ライブラリの「decimal」モジュールが提供されています。このモジュールには、10進数計算を効率的かつ高精度に処理するための多数の関数が含まれており、金額計算や誤差が許されない科学技術計算などで活躍します。ここでは、その中でも特によく使われる重要な関数を、実際のコード例と実行結果とあわせてわかりやすく紹介します。
compare():2つのDecimal値を比較する
compare()は、2つの10進数を比較する関数です。第1引数のDecimalの方が大きい場合は1、小さい場合は-1、両者が等しい場合は0を返します。
コード例
import decimal
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(2.61)
# 10進数を比較する
print('結果 : ', val1.compare(val2))
# 値を変更して再比較
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(-2.6)
print('結果 : ', val1.compare(val2))
# 値を変更して再比較
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(2.6)
print('結果 : ', val1.compare(val2))実行結果
結果 : -1 結果 : 1 結果 : 0
max() / min():最大値と最小値を求める
max()とmin()は、それぞれ2つの10進数のうち大きい方と小さい方を返す関数です。
コード例
import decimal
val1 = decimal.Decimal(2.6)
val2 = decimal.Decimal(2.61)
# 最大値と最小値を求める
print('最大値 : ', round(val1.max(val2), 2))
print('最小値 : ', round(val1.min(val2), 2))実行結果
最大値 : 2.61 最小値 : 2.60
getcontext():演算精度を変更する
getcontext().precを設定すると、算術演算の精度(有効桁数)を変更できます。デフォルトの精度は28桁です。次の例では、精度の設定値に応じて除算の結果がどのように変化するかを確認できます。
コード例
from decimal import * print(Decimal(13) / Decimal(7)) getcontext().prec = 6 print(Decimal(13) / Decimal(7)) getcontext().prec = 10 print(Decimal(13) / Decimal(7))
実行結果
1.857142857142857142857142857 1.85714 1.857142857
exp():自然指数関数 e**x を求める
exp()は、指定した数値における自然指数関数e**xの値を返します。ネイピア数e自体もDecimal(1).exp()で求められます。
コード例
from decimal import * # ネイピア数eを求める print(Decimal(1).exp()) # eの2乗を求める print(Decimal(2).exp()) # eの4乗を求める print(Decimal(4).exp())
実行結果
2.718281828459045235360287471 7.389056098930650227230427461 54.59815003314423907811026120
as_integer_ratio():整数比(分数)として取得する
扱っている10進数を、「その商が元の値になるような整数のペア」として取得したい場合があります。as_integer_ratio()を使うと、分子と分母からなるタプルとして簡単に取り出せます。
コード例
from decimal import *
v = Decimal('2.1834').as_integer_ratio()
print(v)
v = Decimal('-1.92').as_integer_ratio()
print(v)実行結果
(10917, 5000) (-48, 25)
ln() / log10():自然対数と常用対数を計算する
ln()は自然対数(底e)、log10()は常用対数(底10)を計算します。対数を求めたい10進数の値を渡して呼び出します。
コード例
from decimal import *
ln_val = Decimal('2.1').ln()
print(ln_val)
log_val = Decimal('2.1').log10()
print(log_val)実行結果
0.7419373447293773124826065257 0.3222192947339192680072441618
fma(a, b):融合積和演算を行う
fma()は「fused multiply and add(融合積和)」と呼ばれる特殊な関数です。呼び出し元のDecimalに第1引数aを掛け合わせ、その結果に第2引数bを加算した値を返します。つまり「x × a + b」を1回の演算で実行でき、高速であるうえ丸め誤差も抑えられるのが特徴です。
コード例
from decimal import * # (2.1 * 2) + 5 と同じ計算 fma_val = Decimal(2.1).fma(2, 5) print(fma_val) # (8.1 * 3) + 5 と同じ計算 fma_val = Decimal(8.1).fma(3, 5) print(fma_val)
実行結果
9.200000000000000177635683940 29.29999999999999893418589636
なお、上記の出力に細かい端数が現れているのは、float型の値からDecimalを生成すると、二進浮動小数点の内部表現がそのまま引き継がれるためです。厳密な10進数として扱いたい場合は、Decimal('2.1')のように文字列で初期化することが推奨されます。
まとめ
decimalモジュールを活用すれば、Pythonでも誤差を抑えた高精度な10進数演算が可能になります。比較や大小判定にはcompare()やmax()/min()、精度の制御にはgetcontext().prec、数学関数にはexp()やln()/log10()、整数比への変換にはas_integer_ratio()、融合積和にはfma()といったように、用途に応じて適切な関数を選ぶことが大切です。金額計算など正確性が求められる場面では、ぜひこれらの関数を活用してみてください。
-
Pythonのosモジュール入門:ディレクトリ操作とファイル操作の基本をマスターしよう
はじめにPythonのosモジュールは、開発者が実行中のオペレーティングシステム(OS)とやり取りするためのさまざまな関数を提供する標準ライブラリです。この記事では、その中でも特によく使われる以下の操作について解説します。ディレクトリ(フォルダ)の作成・削除ディレクトリ名の変更ファイル操作の基本それでは、早速始めていきましょう。準備:モジュールのインポートosモジュールはPythonのインストール時に同梱されているため、PIPなどで別途インストールする必要はありません。各種メソッドや関数を使うには、モジュールをインポートするだけです。import osこれで、osモジュールが提供するさまざまな
-
PythonのCGIとは?仕組みとサーバー設定方法をわかりやすく解説
CGI(Common Gateway Interface:共通ゲートウェイインターフェース)は、HTTPサーバーなどの情報サーバーと外部のゲートウェイプログラムがやり取りするための標準規格です。現在のバージョンはCGI/1.1であり、CGI/1.2が策定中です。Webブラウジングの流れCGIの概念を理解するために、ハイパーリンクをクリックして特定のWebページやURLを閲覧するときに何が起こるのかを見てみましょう。ブラウザがHTTP Webサーバーに接続し、URL(つまりファイル名)を要求します。WebサーバーはURLを解析してファイル名を探します。該当するファイルが見つかればそれをブラウザへ