首頁 > 後端開發 > Python教學 > Python中的數學模塊:十進制和分數

Python中的數學模塊:十進制和分數

Jennifer Aniston
發布: 2025-03-09 09:15:14
原創
622 人瀏覽過

Mathematical Modules in Python: Decimal and Fractions

即使是最基本的數學運算有時也會產生錯誤的結果。這是由於存儲某些數字的精確值存在限製造成的。您可以通過使用Python中的decimal模塊來克服這些限制。同樣,我們在上一個教程中學到的mathcmath模塊都不能幫助我們進行基於分數的算術運算。但是,Python中的fractions模塊恰好可以做到這一點。

本教程將介紹這兩個模塊以及它們提供的不同函數。

使用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')
登入後複製
登入後複製

如您所見,getcontext()函數的值決定了計算的精度、舍入規則和異常引發行為。

您可以使用setcontext()函數獲取和設置計算的當前上下文。使用with語句可以臨時更改計算的上下文。

模塊中有三個內置上下文可用於計算:ROUND_HALF_UPROUND_HALF_EVENROUND_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下,0 的除法結果為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模塊在這種情況下可以提供很大的幫助。

創建分數

fractions模塊允許您從數字、浮點數、十進制數甚至字符串創建Fraction實例。與decimal模塊一樣,當從浮點數創建分數時,此模塊也存在一些問題。以下是一些示例:

from fractions import Fraction
from decimal import Decimal

Fraction(11, 35)
# 返回 Fraction(11, 35)

Fraction(10, 18)
# 返回 Fraction(5, 9)

Fraction('8/25')
# 返回 Fraction(8, 25)

Fraction(1.13)
# 返回 Fraction(1272266894732165, 1125899906842624)

Fraction('1.13')
# 返回 Fraction(113, 100)

Fraction(Decimal('1.13'))
# 返回 Fraction(113, 100)
登入後複製

分數的算術運算

您還可以像普通數字一樣對分數執行簡單的數學運算,如加法和減法。

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模塊

您還可以將此模塊與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中的random模塊。

以上是Python中的數學模塊:十進制和分數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板