浮點數誤差
浮點數一個普遍的問題就是在計算機的世界中,浮點數並不能準確地表示十進制。並且,即便是最簡單的數學運算,也會帶來不可控制的後果。因為,在計算機的世界中只認識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對象肯定是要快很多的。
閱讀更多 編程python新視野 的文章