使用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
结论
提高精度后,问题解决