Python stat_env:我一直收到一个TypeError:';十进制。十进制';对象不能解释为整数

Python stat_env:我一直收到一个TypeError:';十进制。十进制';对象不能解释为整数,python,Python,我不明白为什么我会得到: TypeError: 'decimal.Decimal' object cannot be interpreted as an integer. 为此,我使用了一个统计python环境statistics\u env。我怀疑这是因为列表s,但不知道如何修复它 它不喜欢这一行: return Decimal(Decimal(l)**Decimal(k))*Decimal(math.exp(Decimal(-l)))/Decimal(math.factorial(Deci

我不明白为什么我会得到:

TypeError: 'decimal.Decimal' object cannot be interpreted as an integer.
为此,我使用了一个统计python环境
statistics\u env
。我怀疑这是因为列表
s
,但不知道如何修复它

它不喜欢这一行:

return Decimal(Decimal(l)**Decimal(k))*Decimal(math.exp(Decimal(-l)))/Decimal(math.factorial(Decimal(k)))
以下是完整的代码:

import numpy as np
import math
import matplotlib
import matplotlib.pyplot as plt
from decimal import Decimal

def poisson(l,k):
    return Decimal(Decimal(l)**Decimal(k))*Decimal(math.exp(Decimal(-l)))/Decimal(math.factorial(Decimal(k)))

n=1000
p=0.003
l=n*p
S=[]

for i in range(0,n):
    S.append(poisson(l,i))

len_x=18
b=range(0,len_x+1)
plt.close('all')
plt.stem(b,S[0:len_x+1])
title='Bernoulli Trials: PMF - Poisson Approximation'
xlabel='Number of successes in n='+str(n)+' trials'
ylabel='Probability'
plt.title(title)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.xticks(b)

plt.show()

我们知道错误发生在哪一行,但不知道哪个实际函数调用出现错误:

return Decimal(Decimal(l)**Decimal(k))*Decimal(math.exp(Decimal(-l)))/Decimal(math.factorial(Decimal(k)))
为了确定哪个部分失败了,我们可以将表达式分解为所有单独的行,同时保持所有内容都相等。显然,该行是一个公式,但我们可以在返回结果之前预先定义/预先计算该行的所有不同部分:

a = Decimal(l)
b = Decimal(k)
c = Decimal(a**b)
d = Decimal(-l)
e = math.exp(d)
f = Decimal(e)
g = math.factorial(b)
h = Decimal(g)
return c*f/h
现在运行代码时,Python会告诉我们发生错误的确切行:

g = math.factorial(b)

因此,我们可以确定
math.factorial()
不能接受十进制,因此需要整数。幸运的是,
b
对应于
Decimal(k)
,而
k
是一个整数,因此用
math.factorial(k)
替换该表达式可以解决这个问题。

这能回答您的问题吗?这句话是一个公式我发现了你的问题,删除了我的评论;有关解释,请参见链接的答案。我发现它的方法是把它分成多行。我可以发布一个答案来解释这一点。我查看了你的链接,但我现在仍然不知道如何将其分解为多行。我发布了一个答案,并举例说明我的意思。在Python或任何语言中,您可以自由地预先定义表达式的各个部分,并逐点计算各个部分,而不是在一行中完成所有操作。希望你看了我的例子后明白了。这个链接不是如何把事情分解成多行,而是你的问题的重复,他们试图对一个小数进行阶乘。