如何在python中进行十进制运算

2024-10-08 19:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用chudnowsky算法计算π,我希望它精确,所以
我试着用十进制模块,但我不明白我怎么能用它。 代码是

import decimal as dc
import math
dc.getcontext().prec = 54
sum1 = 0
for k in range(0, 100):
    a = (-1)**k*(math.factorial(6*k))*(13591409+545140134*k)
    b = (math.factorial(3*k))*(math.factorial(k))**(3)*(640320**(3*k))
    sum1 += a/b

sum1 = sum1/(426880*dc.Decimal("10005")**(1/2))
sum1= sum1**(-1)
print(sum1)

但它给

Exception "unhandled TypeError"
unsupported operand type(s) for ** or pow(): 'decimal.Decimal' and 'float'

我看了网上,但找不到一个好的来源,涵盖的东西,并给出了例子。如果我想要一个十进制类型的结果,并且操作基本上是无损的,我如何实现上面的代码呢?它的python3.6 我是新来的,所以我感谢你对我的宽容。你知道吗


Tags: 模块代码import算法forasmathdc
2条回答

我对decimal没有太多的经验,但是您得到的错误是,您不能将**运算符与十进制和浮点一起使用。解决方法是将指数也设为Decimal,这样就可以代替dc.Decimal("10005")**(1/2)执行dc.Decimal(10005)**dc.Decimal(1/2)。你知道吗

基本上,你不能把Decimalsfloats结合起来,但是integers不是问题。除法integers时只需小心,因为这将导致floats,因此还需要将sum1 += a/b改为sum1 += dc.Decimal(a)/b。当一个操作数是Decimal时,结果也将是Decimal。程序中的所有其他数字都是整数,所以现在应该可以正常工作了。你知道吗

在这里使用模块decimal没有意义。您正在使用math.xxxx函数,我引用模块文档:

The following functions are provided by this module. Except when explicitly noted otherwise, all return values are floats.

资料来源:https://docs.python.org/3/library/math.html

math.factorial-返回float

除此之外:重新计算常量:

dc.Decimal("10005")**(1/2) == 5002.5

无需重新计算-只需使用dc.Decimal('5002.5')

相关问题 更多 >

    热门问题