Python decimal – division、round、precision

Pythonのdecimalモジュールは、数値の正確な精度と丸め付けを使用して除算を支援します。

Pythonのdecimalモジュール

このPythonのdecimalモジュールのレッスンでは、プログラムでの10進数の管理方法、精度やフォーマットのための小数の計算方法を見ていきます。小数の精度は、数値が正しく扱われていない場合に非常に簡単に失われることがあります。decimal モジュールおよびその利用可能な関数がこれらの領域でどのように役立つかを見てみましょう。

小数の数値を扱う

小数は、固定された小数点を持つ浮動小数点数です。必要に応じて正しく数値を丸める必要があります。そうしないと、結果が予期しないものになる可能性があります。Pythonのdecimalモジュールを使用すると、小数の精度が向上します。

必要な十進モジュール

実際にこのモジュールを使用する前に、どの精度に言及しているのか確認し、なぜこのモジュールが必要なのかを確立しましょう。次のコードスニペットを見てみましょう:

division = 72 / 7
print(division)

このプログラムの出力を見てみましょう: まあ、答えは実際には正確ではなく、小数点は一切ありませんでした! この問題を十進モジュールを使用してどのように修正できるか見てみましょう。

十進モジュールの使用

この投稿で作成するすべてのプログラムで、十進モジュールをインポートします:

import decimal

このモジュールから特定の関数のみをインポートする場合もあります。これは次のように行えます:

from decimal import Decimal

さて、十進モジュールをいくつかのプログラムに組み込むのを始めましょう。

Python十進モジュールの例

モジュールに関連する例から始めましょう。

小数点以下の除算の修正

ここでは、浮動小数点結果を生成するはずの除算を修正します。小数点モジュールを使用した修正されたプログラムは次のようになります:

import decimal

division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)

このプログラムの出力を見てみましょう: 注意してください、除算は正確であり、おそらくそれはあまりにも正確ですか?

単一の操作の精度の制御

前のプログラムでは、答えには25桁の小数点が含まれていました。しかし、小数点以下の値を3桁までしか必要としない場合はどうでしょうか?これも制御できます。ここでは、プログラム内の他の操作には影響しない答えの精度を制御します:

import decimal

with decimal.localcontext() as ctx:
    ctx.prec = 3
    division = decimal.Decimal(72) / decimal.Decimal(7)
    print(division)

again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)

ポイントを証明するために、除算操作を2回行いました。このプログラムの出力を見てみましょう: 何か気付きましたか?設定した精度は単一の回でのみ有効でした。次に除算を行うと、同じ結果が返されました。

プログラムの完全な精度の制御

プログラム全体で精度をグローバルに制御することも可能です。これは、プログラム内で多くの数値を扱う場合に常に推奨されるわけではありません。以下は例です:

import decimal

decimal.getcontext().prec = 3

division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)

again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)

このプログラムの出力を見てみましょう:

数値の四捨五入

round(...) 関数を使用して、数値を優雅に四捨五入することができます。試してみましょう:

import decimal

#13.48または13.49に丸めることができます
rounded = round(13.485, 2)
print(rounded)

このプログラムの出力を見てみましょう:プログラム内の数値は13.48または13.49に丸めることができます。デフォルトでは、round(...) 関数は切り捨てを行います。これも変更可能です:

import decimal

#13.48または13.49に丸めることができます
rounded = round(13.485, 2)
print(decimal.Decimal(rounded).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_UP))

このプログラムの出力を見てみましょう:

Pythonの10進コンテキストを取得する

デフォルトのコンテキストを確認したい場合は、以下のスクリプトを使用できます:

from decimal import *
print(getcontext())

このプログラムの出力を見てみましょう:Pythonの10進モジュールに関しては以上です。浮動小数点数を扱う際に非常に役立ちます。

Source:
https://www.digitalocean.com/community/tutorials/python-decimal-division-round-precision