美文网首页
python的decimal精确运算

python的decimal精确运算

作者: Chaweys | 来源:发表于2021-06-16 17:24 被阅读0次

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,始终不进位(不管负数还是正数)

相关文章

网友评论

      本文标题:python的decimal精确运算

      本文链接:https://www.haomeiwen.com/subject/pvrfyltx.html