python中精确的浮点数运算

起步

浮点数的一个广泛的问题是它们不能精确的表示十进制数。code

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>>

这是因为底层 CPU 和 IEEE 754 标准经过本身的浮点单位去执行算术时的特征。看似有穷的小数, 在计算机的二进制表示里倒是无穷的。ip

通常状况下,这一点点的小偏差是容许存在的。若是不能容忍这种偏差(好比金融领域),那么就要考虑用一些途径来解决这个问题了。ci

Decimal

使用这个模块不会出现任何小偏差。字符串

>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True

尽管代码看起来比较奇怪,使用字符串来表示数字,可是 Decimal 支持全部经常使用的数学运算。 decimal 模块容许你控制计算的每一方面,包括数字位数和四舍五入。在这样作以前,须要建立一个临时上下文环境来改变这种设定:get

>>> from decimal import Decimal, localcontext
>>> a = Decimal('1.3')
>>> b = Decimal('1.7')
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
...     ctx.prec = 3
...     print(a / b)
...
0.765
>>> with localcontext() as ctx:
...     ctx.prec = 50
...     print(a / b)
...
0.76470588235294117647058823529411764705882352941176
>>>

因为 Decimal 的高精度数字天然也就用字符串来作展现和中转。数学

总结

总的来讲,当涉及金融领域时,哪怕是一点小小的偏差在计算过程当中都是不容许的。所以 decimal 模块为解决这类问题提供了方法。it

相关文章
相关标签/搜索