前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【测试开发】python系列教程:decimal库

【测试开发】python系列教程:decimal库

作者头像
雷子
发布2023-08-21 19:53:43
2380
发布2023-08-21 19:53:43
举报

上一篇

【测试开发】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,可以处理各种货币常见的业务,如货币兑换、汇率计算、支付处理等。在日常的工作中用的比较少,可能用的最多的就是四舍五入,保留几位小数

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档