初等数学 阶乘计算 精度问题

使用Decimal计算阶乘时,精度不够时,会以科学计算法保存数据

初等数学 阶乘计算 精度问题

import decimal
from decimal import localcontext

# 阶乘
def factorialN(num: int):
    print("factorialN", num)
    with localcontext() as ctx:
        # 这里要设置精度(精度太小,输出的结果就会似科学计算方式输出,达不到实际预期值)
        ctx.prec = 20000
        if num < 0:
            print("error!")
            return -1
        if num == 0 or num == 1:
            return 1
        if num > 1000:
            print("too large num value!")
            return -1
        # 阶乘计算
        decRlt = decimal.Decimal("1")
        for i in range(2, num):
            decRlt = decRlt * decimal.Decimal(i)
        print(decRlt)

# 阶乘精度小的情况
def factorialN_2(num: int):
    print("factorialN_2", num)
    with localcontext() as ctx:
        ctx.prec = 100
        if num < 0:
            print("error!")
            return -1
        if num == 0 or num == 1:
            return 1
        if num > 1000:
            print("too large num value!")
            return -1
        # 阶乘计算
        decRlt = decimal.Decimal("1")
        for i in range(2, num):
            decRlt = decRlt * decimal.Decimal(i)
        print(decRlt)

factorialN(100)
factorialN_2(100)

输出结果

factorialN 100
933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000
factorialN_2 100
9.332621544394415268169923885626670049071596826438162146859296389521759999322991560894146397615651822E+155

结论

提高精度后,问题解决

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值