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

2023-08-21 19:53:43 浏览数 (1)

上一篇

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

0 人点赞