.net column
.NET開発者のためのブログメディア

Pythonでのdecimalモジュールの扱い方とは?演算誤差を防ぐためのdecimal

2020年12月07日

SE
decimaiモジュールとはどんな機能なのでしょうか?

PM
十進数の計算を行うためのモジュールです。実際に詳しくみていきましょう。

Pythonでのdecimalモジュールの扱い方とは?


今回は、Pythonでのdecimalモジュールの扱い方について説明します。

小数点を扱う場合、float型を使用します。
コンピュータは2進数で数値を扱うため、誤差が発生する場合があります。
これを防ぐために、Pythonではdecimalモジュールが用意されています。

ここでは、decimalモジュールの
・基本的な使い方
・演算
・FloatOperationのtrap
・精度の指定
・四捨五入(round)
・四捨五入(quantize)
について紹介します。

Pythonでのdecimalモジュールの扱い方に興味のある方はぜひご覧ください。

基本的な使い方

Pythonでのdecimalモジュールの基本的な使い方を紹介します。

decimalモジュールを使用するにはimportが必要です。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

float型で計算した場合は、誤差が生じています。
一方、decimalモジュールで計算した場合、誤差が生じていません。
Decimalクラスには、文字列を指定する必要があります。

このようにdecimalモジュールを使用します。

演算

Pythonでのdecimalモジュールを使った演算について紹介します。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

このように、誤差なく加減乗除の演算ができます。

FloatOperationのtrap

Decimalクラスには、文字列を指定する必要があります。
数値を指定してもエラーにはなりません。
演算結果はどのようになるのでしょうか。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

数値で指定すると、誤差が生じていることが分かります。

間違って数値で指定することを防ぐために、FloatOperationのtrapを有効にする方法があります。
実際のソースコードを見てみましょう。

実行結果は以下のようになります。

Decimalをfloatで初期化したり、Decimalをfloatで計算すると、実行時エラーが発生します。
このように、PythonではFloatOperationのtrapを有効にすることで、意図しない初期化や演算を防げます。

精度の指定

Pythonでのdecimalモジュールを使った、精度を指定した演算について紹介します。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

「getcontext().prec」で精度を指定することで、演算結果が指定精度で出力されていることが分かります。
このように、Pythonでは精度を指定した演算ができます。

四捨五入(round)

Pythonでのdecimalモジュールを使った丸めについて紹介します。
組み込み関数のroundメソッドを使用します。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

小数を任意の桁数で四捨五入したり、整数を任意の桁数で四捨五入したりできます。
このように、組み込み関数のroundメソッドで四捨五入できます。

四捨五入(quantize)

Pythonでのdecimalモジュールを使った丸めについて、もう一つの方法を紹介します。
decimal標準ライブラリのquantizeメソッドを使用します。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

整数部の四捨五入は少し特殊です。
このように、Pythonではquantizeメソッドで四捨五入できます。

SE
精度を指定できるということは、小数点も定義できるいうことでしょうか?

PM
そうです。文字列として定義することで誤差の発生も防ぐことができます。

まとめ

Pythonでのdecimalモジュールの扱い方について説明しました。
基本的な使い方だけでなく、演算精度の指定方法や四捨五入の方法なども紹介しました。
ぜひご自身でソースコードを書いて、理解を深めてください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags