上一篇
【测试开发】python系列教程:collections库
这次我们分享decimal库
Python decimal库是Python标准库中的一部分,用于处理数字货币和金融交易。它提供了一个完整的货币处理API,可以处理各种货币常见的业务,如货币兑换、汇率计算、支付处理等。
那么看下例子
代码语言:javascript复制
from decimal import Decimal
1、可传入整数或字符串浮点数
print(Decimal(10)) #结果:10
print(Decimal('15.212')) #结果:15.212
print(Decimal(15.212)*1000)
#结果:15212.000
【注】:不能传入浮点数,因为浮点数本身就是不准确数值
2、从浮点型转为Decimal类型
print(Decimal.from_float(22.22))
#结果:
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.124').quantize(Decimal('0.00')))
#结果:5.12
6、decimal模块进行十进制数学计算
print(Decimal('5.125') Decimal('6.125') Decimal('7.125'))
#结果:18.375
7、去掉小数位
print(Decimal('17.00').to_integral())
#结果:17
8、去掉数值小数位后多余的0
def func1(num):
if Decimal(num) == 0:
return 0
elif '.' not in str(num):
return num
else:
return "{}".format(num).rstrip("0")
print(func('5.0001')) #结果str类型:5
print(func('5.01')) #结果str类型:5.01
print(func('0.0001')) #结果str类型:0
9、优化去掉数值小数位后多余的0-针对小数点后0位数过多的
如:0.0000000001234
def dealzero(num):
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")
from decimal import *
x1 = Decimal('-3.1234567') #负数第五位小数位超过5
print(x) #-3.1234567
print(x1.quantize(Decimal('1.0000'),ROUND_HALF_EVEN)) #-3.1235,默认值,四舍五入进位
print(x1.quantize(Decimal('1.0000'),ROUND_HALF_DOWN)) #-3.1235,为接近最近的0位进了一位
print(x1.quantize(Decimal('1.0000'),ROUND_HALF_UP)) #-3.1235,
print(x1.quantize(Decimal('1.0000'),ROUND_CEILING)) #-3.1234,ceiling天花板趋近于更大,所以这里不进位(因为是负数如果是正数就会进位)
print(x1.quantize(Decimal('1.0000'),ROUND_FLOOR)) #-3.1235,floor地板趋近于更小,所以这里进位了(因为是负数如果是正数就不会进位)
print(x1.quantize(Decimal('1.0000'),ROUND_UP)) #-3.1235,始终进位(不管负数还是正数)
print(x1.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,始终不进位(不管负数还是正数)
decimal库提供了一个完整的货币处理API,可以处理各种货币常见的业务,如货币兑换、汇率计算、支付处理等。在日常的工作中用的比较少,可能用的最多的就是四舍五入,保留几位小数