在python或是javascript中常常會有小數溢位或是不夠精確的問題存在。
本文介紹在python中執行精確的小數計算方法。
問題
python在執行浮點運算時沒辦法精確表達所有的十進制小數位。
原因
會有浮點運算誤差的原因就是底層CPU在運算時,他的浮點運算單元(floating point unit – FPU)是利用IEEE-754標準來執行所以會有這種運算”特性“。因此使用float時就無法避免會產生這樣的誤差。
更多關於IEEE-754標準請參考:https://link.medium.com/BcdyiMCLmZ
解決方法
我們可以使用decimal module來避免該問題發生(會犧牲效能)。
1 2 3 4 |
from decimal import Decimal a = Decimal("4.1") b = Decimal("5.329") print(a+b) |
這邊Decimal的參數必須是string,不能是float,否則還是會產生誤差。
decimal module也能控制尾數或是四捨五入。
1 2 3 4 5 6 7 8 |
from decimal import Decimal from decimal import localcontext a = Decimal("4.1") b = Decimal("5.329") print(a/b) with localcontext() as ctx: ctx.prec = 3 print(a/b) |
留言