
1、浮点数的一个普遍的问题是它们不能精确的表示十进制数。
1 2 3 4 5 6 | >>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
|
这是由于底层 CPU 和IEEE 754 标准通过自己的浮点单位去执行算术时的特征。看似有穷的小数, 在计算机的二进制表示里却是无穷的。
一般情况下,这一点点的小误差是允许存在的。如果不能容忍这种误差(比如金融领域),那么就要考虑用一些途径来解决这个问题了。
2、Decimal
使用这个模块不会出现任何小误差。
1 2 3 4 5 6 7 8 9 | >>> 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 模块允许你控制计算的每一方面,包括数字位数和四舍五入。在这样做之前,需要创建一个临时上下文环境来改变这种设定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> 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
>>>
|