python的decimal精确运算
from deciaml import Decimal
1、可传入整数或字符串浮点数
print(Decimal(5)) #结果:5
print(Decimal('5.125')) #结果:5.125
print(Decimal(5.55)*100)
#结果:554.9999999999999822364316060
【注】:不能传入浮点数,因为浮点数本身就是不准确数值
2、从浮点型转为Decimal类型
print(Decimal.from_float(22.222))
#结果:22.22200000000000130739863379858434200286865234375
3、通过设定有效数字,限定结果样式
from decimal import *
#表示设置小数只取6位小数位
getcontext().prec=6
print(Decimal(1)/Decimal(7))
#结果:0.142857
getcontext().prec=3
print(Decimal(55)*1000)
#结果:5.50E+4
【注】:当设置prec长度比数字的长度小的话,结果会有误
4、四舍五入,保留几位小数
print(Decimal('5.1251').quantize(Decimal('0.00')))
#结果:5.13
print(Decimal('5.125').quantize(Decimal('0.00')))
#结果:5.12 {注意该特殊情况}
5、Decimal 结果转化为string
print(str(Decimal('5.1251').quantize(Decimal('0.00')))
#结果:5.13
6、decimal模块进行十进制数学计算
print(Decimal('5.125')+Decimal('6.125')+Decimal('7.125'))
#结果:18.375
7、去掉小数位
print(Decimal('5.0000').to_integral())
#结果:5
8、去掉数值小数位后多余的0
def func(num):
if Decimal(num) == 0:
return 0
elif '.' not in str(num):
return num
else:
return "{}".format(num).rstrip("0")
print(func('5.0000')) #结果str类型:5
print(func('5.0100')) #结果str类型:5.01
print(func('0.0000')) #结果str类型:0
9、优化去掉数值小数位后多余的0-针对小数点后0位数过多的
如:0.0000000001234
def deal_extra_zero(num):
"""
:param num: 任意数值
:return: 返回去掉最末尾的多余的数字0,str类型
"""
if ('E' in str(num) or 'e' in str(num)):
y = '{:.18f}'.format(float(num))
if Decimal(y) == 0:
return 0
elif '.' not in str(y):
return y
else:
return "{}".format(y).rstrip("0")
else:
if Decimal(num) == 0:
return 0
elif '.' not in str(num):
return num
else:
return "{}".format(num).rstrip("0")
decimal.quantize()参数rounding的各参数解释
from decimal import *
x = Decimal('-3.1234567') #负数第五位小数位超过5
print(x) #-3.1234567
print(x.quantize(Decimal('1.0000'),ROUND_HALF_EVEN)) #-3.1235,默认值,四舍五入进位
print(x.quantize(Decimal('1.0000'),ROUND_HALF_DOWN)) #-3.1235,为接近最近的0位进了一位
print(x.quantize(Decimal('1.0000'),ROUND_HALF_UP)) #-3.1235,
print(x.quantize(Decimal('1.0000'),ROUND_CEILING)) #-3.1234,ceiling天花板趋近于更大,所以这里不进位(因为是负数如果是正数就会进位)
print(x.quantize(Decimal('1.0000'),ROUND_FLOOR)) #-3.1235,floor地板趋近于更小,所以这里进位了(因为是负数如果是正数就不会进位)
print(x.quantize(Decimal('1.0000'),ROUND_UP)) #-3.1235,始终进位(不管负数还是正数)
print(x.quantize(Decimal('1.0000'),ROUND_DOWN)) #-3.1234,始终不进位(不管负数还是正数)
x2 = Decimal('-3.1234321') #负数第五位小数位不超过5
print(x2) #--3.1234321
print(x2.quantize(Decimal('1.0000'),ROUND_HALF_EVEN)) #-3.1234,默认值,四舍五入进位
print(x2.quantize(Decimal('1.0000'),ROUND_HALF_DOWN)) #-3.1234,为接近最近的0位进了一位
print(x2.quantize(Decimal('1.0000'),ROUND_HALF_UP)) #-3.1234,
print(x2.quantize(Decimal('1.0000'),ROUND_CEILING)) #-3.1234,ceiling天花板趋近于更大,所以始终不进位(因为是负数如果是正数就会进位)
print(x2.quantize(Decimal('1.0000'),ROUND_FLOOR)) #-3.1235,floor地板趋近于更小,所以始终进位了(因为是负数如果是正数就不会进位)
print(x2.quantize(Decimal('1.0000'),ROUND_UP)) #-3.1235,始终进位(不管负数还是正数)
print(x2.quantize(Decimal('1.0000'),ROUND_DOWN)) #-3.1234,始终不进位(不管负数还是正数)
x3 = Decimal('3.1234567') #正数第五位小数位超过5
print(x3) #3.1234567
print(x3.quantize(Decimal('1.0000'),ROUND_HALF_EVEN)) #3.1235,默认值,四舍五入进位
print(x3.quantize(Decimal('1.0000'),ROUND_HALF_DOWN)) #3.1235,为接近最近的四舍五入进位
print(x3.quantize(Decimal('1.0000'),ROUND_HALF_UP)) #3.1235,
print(x3.quantize(Decimal('1.0000'),ROUND_CEILING)) #3.1235,ceiling天花板趋近于更大,所以这里始终进位(因为是正数)
print(x3.quantize(Decimal('1.0000'),ROUND_FLOOR)) #3.1234,floor地板趋近于更小,所以这里始终不进位(因为是正数)
print(x3.quantize(Decimal('1.0000'),ROUND_UP)) #3.1235,始终进位(不管负数还是正数)
print(x3.quantize(Decimal('1.0000'),ROUND_DOWN)) #3.1234,始终不进位(不管负数还是正数)
x4 = Decimal('3.1234321') #正数第五位小数位不超过5
print(x4) #3.1234321
print(x4.quantize(Decimal('1.0000'),ROUND_HALF_EVEN)) #3.1234,默认值,四舍五入未进位
print(x4.quantize(Decimal('1.0000'),ROUND_HALF_DOWN)) #3.1234,为接近最近的0位四舍五入未进位
print(x4.quantize(Decimal('1.0000'),ROUND_HALF_UP)) #3.1234,
print(x4.quantize(Decimal('1.0000'),ROUND_CEILING)) #3.1235,ceiling天花板趋近于更大,所以这里始终进位(因为是正数)
print(x4.quantize(Decimal('1.0000'),ROUND_FLOOR)) #3.1234,floor地板趋近于更小,所以这里始终不进位(因为是正数)
print(x4.quantize(Decimal('1.0000'),ROUND_UP)) #3.1235,始终进位(不管负数还是正数)
print(x4.quantize(Decimal('1.0000'),ROUND_DOWN)) #3.1234,始终不进位(不管负数还是正数)