python 浮點數精確運算解決方案 !

浮點數誤差

浮點數一個普遍的問題就是在計算機的世界中,浮點數並不能準確地表示十進制。並且,即便是最簡單的數學運算,也會帶來不可控制的後果。因為,在計算機的世界中只認識0與1。

>>> x = 4.20

>>> y = 2.10

>>> x + y

6.3000000000000007

>>> (x+y) == 6.3

False

>>> x = 1.2

>>> y = 2.3

>>> x + y

3.5

>>> (x + y) == 3.5

True

上述種種問題,就來自於計算機的cpu與浮點數的表示方式,我們自己在代碼層面是沒法控制的。在有些需要精確表示浮點數的場合,例如財務結算,這些誤差就不可接受。

decimal模塊進行十進制數學計算

python中的decimal模塊可以解決上面的煩惱

decimal模塊中,可以通過整數,字符串或原則構建decimal.Decimal對象。如果是浮點數,特別注意因為浮點數本身存在誤差,需要先將浮點數轉化為字符串。

>>> from decimal import Decimal

>>> from decimal import getcontext

>>> Decimal('4.20') + Decimal('2.10')

Decimal('6.30')

>>> from decimal import Decimal

>>> from decimal import getcontext

>>> x = 4.20

>>> y = 2.10

>>> z = Decimal(str(x)) + Decimal(str(y))

>>> z

Decimal('6.3')

>>> getcontext().prec = 4 #設置精度

>>> Decimal('1.00') /Decimal('3.0')

Decimal('0.3333')

當然精度提升的同時,肯定帶來的是性能的損失。在對數據要求特別精確的場合(例如財務結算),這些性能的損失是值得的。但是如果是大規模的科學計算,就需要考慮運行效率了。畢竟原生的float比Decimal對象肯定是要快很多的。


分享到:


相關文章: