在进行小数计算的时候使用float,经常会出现小数位不精确的情况。在python开发中,推荐使用decimal来完成小数位的精度计算。
decimal是python中的标准库,直接将Decimal导入到代码块中使用即可。
1,浮点数转为Decimal
使用Decimal.from_float函数将随便一个float类型的小数转换成Decimal的数据类型
Decimal.from_float(0.1)
0.1000000000000000055511151231257827021181583404541015625
float类型数据就显出原形了。float浮点数转换完成以后精度位数就变得很长,这是因为float浮点数本身就不精确转换之后才会出现上面的效果。
2,decimal精度设置
使用 decimal 时先导入该模块,通过getcontext() 查看当前上下文,也可以根据需求设置新的精度
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
InvalidOperation])
>>> getcontext().prec = 2 #设置新的精度
>>> Decimal.from_float(0.15)
0.15
3,Decimal 可以基于字符串来构建
在浮点计算时,为了确保精度,可以把浮点数变成字符串,然后在使用字符串构建decimal数值
from decimal import *
Decimal('0.15') > 0.15
4,实现浮点数的精确计算
如果我们想精确计算0.15+0.13,可以通过两种方法,推荐使用第二种
from decimal import *
#方法一:通过浮点数的字符串类型进行转换
a = Decimal('0.15')
a = Decimal('0.13')
a+b > 0.28
#方法二:设置新的精度
getcontext().prec = 2 #设置新的精度为2
Decimal(0.15)+Decimal(0.13) > 0.28