问题
我们需要对小数进行精确计算,不希望因为浮点数天生的误差而带来影响
解决方案
使用decimal模块,牺牲一些性能,得到更高的精度。示例如下:
from decimal import Decimal
a = 4.2
b = 2.1
c = a+b
print(c)
#c= 6.300000000000001
a2 = Decimal('4.2')
b2 = Decimal('2.1')
c2 = a2+b2
print (c2)
#c2 = 6.3
Decimal对象能以任何期望的方式来工作(支持所有常见的数学操作)。如果要将它们打印出来或是在字符串格式化函数中使用,它们看起来就和其他普通的数字一样。
decimal模块的主要功能是允许控制计算过程中的各个方面,这包括数字的位数和四舍五入。要做到这些,需要创建一个本地的上下文环境然后修改其设定。示例如下:
from decimal import 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模块实现了IBM的通用十进制算术规范。
decimal模块主要用在涉及像金融这一类业务的程序中。在这样的程序里,计算中如果出现微小的误差是不容许的。因此decimal模块提供了一种规避误差的方式。
网友评论