ホームページ >バックエンド開発 >Python チュートリアル >Pythonの数学モジュール:小数および分数
最も基本的な数学操作でさえ、間違った結果をもたらすことがあります。これは、特定の数値の正確な値を保存する際の制限によるものです。 Pythonのdecimal
モジュールを使用して、これらの制限を克服できます。同様に、以前のチュートリアルで学んだmath
およびcmath
モジュールは、分数ベースの算術操作を実行するのに役立ちません。ただし、pythonのfractions
モジュールはたまたまそれを行います。
このチュートリアルでは、これら2つのモジュールと提供するさまざまな機能を紹介します。
10進数モジュールを使用してfrom decimal import Decimal Decimal(121) # 返回 Decimal('121') Decimal(0.05) # 返回 Decimal('0.05000000000000000277555756') Decimal('0.05') # 返回 Decimal('0.05') Decimal((0, (8, 3, 2, 4), -3)) # 返回 Decimal('8.324') Decimal((1, (8, 3, 2, 4), -1)) # 返回 Decimal('-832.4')ご覧のとおり、
関数の値は、計算の精度、丸めルール、および例外を上げる動作を決定します。 getcontext()
関数を使用して、計算の現在のコンテキストを取得して設定できます。 setcontext()
ステートメントを使用して、計算のコンテキストを一時的に変更します。 with
数値オーバーフロー、無効な動作、およびゼロによる分割に関連する例外はありません。 ROUND_HALF_UP
は、ほぼすべての例外を有効にします。これはデバッグに最適ですが、ROUND_HALF_EVEN
は計算のデフォルトコンテキストとして使用されます。 ROUND_HALF_EVEN
DefaultContext
以下は、さまざまなコンテキストを使用して単純な分割のために異なる結果を得る方法の例です。
BasicContext
DefaultContext
さまざまなコンテキストの精度と丸めアルゴリズムの違いに注目することに加えて、
であることを観察することもできます。
import decimal from decimal import ROUND_DOWN, ROUND_UP, Decimal as D dec_a = D('0.153') dec_b = D('0.231') zero = D('0') print("无上下文(使用默认值): ", dec_a/dec_b) # 无上下文(使用默认值): 0.6623376623376623376623376623 decimal.setcontext(decimal.BasicContext) print("基本上下文: ", dec_a/dec_b) # 基本上下文: 0.662337662 decimal.setcontext(decimal.ExtendedContext) print("扩展上下文: ", dec_a/dec_b) # 扩展上下文: 0.662337662 print("扩展上下文: ", dec_b/zero) # 扩展上下文: Infinity decimal.setcontext(decimal.DefaultContext) print("默认上下文: ", dec_a/dec_b) # 默认上下文: 0.6623376623376623376623376623 with decimal.localcontext() as l_ctx: l_ctx.prec = 5 l_ctx.rounding = ROUND_UP print("局部上下文: ", dec_a/dec_b) # 局部上下文: 0.66234
ExtendedContext
Infinity
の多くの関数は、コンテキストオブジェクトをパラメーターとして受け入れて、計算を実行します。これにより、計算されたコンテキストまたは精度の値の設定を絶えず避けることができます。
分数モジュールを使用してdecimal
import decimal from decimal import Decimal as D print(D('22').sqrt(decimal.BasicContext)) # 4.69041576 print(D('22').sqrt(decimal.ExtendedContext)) # 4.69041576 print(D('22').sqrt(decimal.DefaultContext)) # 4.690415759823429554565630114 with decimal.localcontext() as l_ctx: l_ctx.prec = 5 print(D('22').sqrt(l_ctx)) # 4.6904モジュールは非常に役立ちます。
fractions
fractions
画分の算術演算Fraction
decimal
加算や減算など、通常の数値などの画分で簡単な数学操作を実行することもできます。
from decimal import Decimal Decimal(121) # 返回 Decimal('121') Decimal(0.05) # 返回 Decimal('0.05000000000000000277555756') Decimal('0.05') # 返回 Decimal('0.05') Decimal((0, (8, 3, 2, 4), -3)) # 返回 Decimal('8.324') Decimal((1, (8, 3, 2, 4), -1)) # 返回 Decimal('-832.4')
モジュールには、limit_denominator(max_denominator)
などのいくつかの重要な方法もあります。この方法では、与えられた分数に最も近い分数を見つけて返すことができます。また、max_denominator
属性を使用して、特定の画分の分子(最低項として表される)とnumerator
属性を返すこともできます。分母を返すこともできます。 denominator
import decimal from decimal import ROUND_DOWN, ROUND_UP, Decimal as D dec_a = D('0.153') dec_b = D('0.231') zero = D('0') print("无上下文(使用默认值): ", dec_a/dec_b) # 无上下文(使用默认值): 0.6623376623376623376623376623 decimal.setcontext(decimal.BasicContext) print("基本上下文: ", dec_a/dec_b) # 基本上下文: 0.662337662 decimal.setcontext(decimal.ExtendedContext) print("扩展上下文: ", dec_a/dec_b) # 扩展上下文: 0.662337662 print("扩展上下文: ", dec_b/zero) # 扩展上下文: Infinity decimal.setcontext(decimal.DefaultContext) print("默认上下文: ", dec_a/dec_b) # 默认上下文: 0.6623376623376623376623376623 with decimal.localcontext() as l_ctx: l_ctx.prec = 5 l_ctx.rounding = ROUND_UP print("局部上下文: ", dec_a/dec_b) # 局部上下文: 0.66234スコアと数学モジュール
モジュールにさまざまな関数を使用して、分数ベースの計算を実行することもできます。 math
import decimal from decimal import Decimal as D print(D('22').sqrt(decimal.BasicContext)) # 4.69041576 print(D('22').sqrt(decimal.ExtendedContext)) # 4.69041576 print(D('22').sqrt(decimal.DefaultContext)) # 4.690415759823429554565630114 with decimal.localcontext() as l_ctx: l_ctx.prec = 5 print(D('22').sqrt(l_ctx)) # 4.6904要約
モジュールで使用して、希望する形式のさまざまな数学関数の値を計算できます。 math
このシリーズの次のチュートリアルでは、pythonの
以上がPythonの数学モジュール:小数および分数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。