decimal模块作用:主要是精确小数,因为float是不精确的,只是无限接近,对于一些需要精确小数点后位数的就需要用decimal。
优点:
Decimal类型是在浮点类型的基础上设计的,但是它在几个地方上要优于floating point:
1、Decimal类型可以非常精确地在计算机中存储,浮点型在计算机中是无法精确存储的,后面的小数会不精确,Decimal类型则不会出现这种情况。同样,由于无法精确存储,浮点型也就无法精确计算。
2、Decimal类型会自动保留小数点后面不需要的0,以与输入的精度相匹配,比如:浮点型的1.20+1.30结果是2.5;而Decimal类型结果是2.50。
3、Decimal类型有很强的管理功能,它能够根据需要设置,来控制输出的格式,得到或者忽略某类错误(如除0,可以设置忽略它,而得到一个Infinity的Decimal值)
使用注意点:
一、Decimal()的参数必须是字符串型
from decimal import Decimal
result=Decimal("3.01")+Decimal("3.02") #Decimal()的参数必须是字符串型
print(result)#6.03
二、可利用getcontext().prec设定有效数字
from decimal import Decimal,getcontext
getcontext().prec=5 #利用getcontext().prec设定有效数字
result=Decimal("10")/Decimal("3")
print(result)#3.3333
三、可使用 quantize:设置小数位数
from decimal import Decimal
result=Decimal(0.123456789).quantize(Decimal("0.0000")) #quantize:设置小数位数
print(result)#0.1235
如果需要四舍五入,则使用rounding="ROUND_HALF_UP"
想要的结果,保留两位小数,不管小数位第二位是否为偶数,后一位是5时,都要进位
注意:如果使用Decimal()计算时,会出现精度丢失,导致四舍五入的结果不准确;
解决办法:分开使用Decimal,单独对计算结果获取精度,再结合一起计算,就可以正确输出,即:Decimal(Decimal(*).quantize(Decimal('0.00000'), rounding="ROUND_HALF_UP") - Decimal(*).quantize(Decimal('0.00000'),rounding="ROUND_HALF_UP") + Decimal((*).quantize(Decimal('0.00000'),
rounding="ROUND_HALF_UP")).quantize(Decimal('0.00'),rounding="ROUND_HALF_UP")
result = Decimal('123.156').quantize(Decimal('0.00'), rounding="ROUND_HALF_UP")
return result#123.16