Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “为什么我的计划有问题?”;“停止”;工作_Python_Python 3.x - Fatal编程技术网

Python “为什么我的计划有问题?”;“停止”;工作

Python “为什么我的计划有问题?”;“停止”;工作,python,python-3.x,Python,Python 3.x,我在Python3.3.2中编写了一个计算pi的程序(只是为了好玩,我不想使用内置的pi)。它工作得很好-它可以获得精确的pi值,最多可保留7位小数。但是,一旦达到这一点,程序将继续,但值不会更改。我尝试过使用decimal.decimal,但它不起作用-它出现了以下错误: TypeError:不支持+:“decimal.decimal”和“float”的操作数类型 这是我的工作代码(使用浮点数而不是小数)。我只包含了实际的算法: pi=float(3) a=2 b=0 c=float(0) w

我在Python3.3.2中编写了一个计算pi的程序(只是为了好玩,我不想使用内置的pi)。它工作得很好-它可以获得精确的pi值,最多可保留7位小数。但是,一旦达到这一点,程序将继续,但值不会更改。我尝试过使用decimal.decimal,但它不起作用-它出现了以下错误:

TypeError:不支持+:“decimal.decimal”和“float”的操作数类型

这是我的工作代码(使用浮点数而不是小数)。我只包含了实际的算法:

pi=float(3)
a=2
b=0
c=float(0)
while 1==1:
    b=a*(a+1)*(a+2)
    c=4/b
    pi=pi+c
    print(str(pi))
    a=a+2
    b=a*(a+1)*(a+2)
    c=4/b
    pi=pi-c
    print(str(pi))
    a=a+2
这就是结果: (对不起,我没有足够的声誉直接发布图片)

请注意,该程序实际上比这更早停止工作,我只是把它放在那里一段时间。 我知道我使用的算法能够找到更多的小数位数,所以有人能告诉我为什么它不工作,并给我任何可能的解决方案吗? 正如您可能从我的代码的简单性中注意到的那样,我并不太擅长python—只是我在学校学到的基本知识。简单的解决方案将不胜感激! 编辑 这是带小数的非工作代码,以及Jasper的建议。
导入十进制
pi=十进制。十进制(3)
a=2
b=0
c=十进制。十进制(0)
尽管如此:
b=a*(a+1)*(a+2)
c=4/b
pi=pi+c
打印(str(pi))
a=a+2
b=a*(a+1)*(a+2)
c=4/b
pi=pi-c
打印(str(pi))
a=a+2
这就是错误:

回溯(最近一次呼叫最后一次): 文件“C:\Users…\fastpi2.py”,第9行,在 pi=pi+c类型错误:不支持+:“decimal.decimal”和“float”的操作数类型


代码失败,因为两个整数的除法会导致浮点(在Python 3中):

>>从十进制输入十进制
>>>pi=十进制(3)
>>>a=2
>>>b=a*(a+1)*(a+2)
>>>c=4/b
>>>类型(c)
>>>pi=pi+c
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:不支持+:“Decimal”和“float”的操作数类型
以下工作:

>>> a = Decimal(2)
>>> one = Decimal(1)
>>> b = a * (a+one) * (a+one+one)
>>> c = Decimal(4) / b
>>> type(c)
<class 'decimal.Decimal'>
>>> pi = pi + c
>>> pi
Decimal('3.166666666666666666666666667')
>a=十进制(2)
>>>一=十进制(1)
>>>b=a*(a+1)*(a+1+1)
>>>c=十进制(4)/b
>>>类型(c)
>>>pi=pi+c
>>>圆周率
十进制('3.166666667')

而1==1
应为
而为True
。如果你使用十进制,你必须在任何地方都使用它。那么你的问题是什么?您的“工作”代码不能达到无限精度,因为
float
s不能达到无限精度。我们无法帮助您处理使用
十进制的非工作代码,因为您没有发布它。@Jasper那么我如何实现它呢?我会把while设置为True并且它会起作用吗?或者还有其他地方需要改变吗?试试看。如果您发布使用
十进制的代码,我们或许可以回答您的问题。但是如果你在任何地方都使用
Decimal
,它应该像现在一样工作。@roippi我不希望它是无限精确的,它可能会在我的计算机崩溃之前崩溃。我只是希望它比现在更精确。另外,对于我使用十进制模块的代码,我不知道如何正确使用它,因此我用
decimal.decimal
替换了
float
。如能帮助您使用,将不胜感激。
>>> a = Decimal(2)
>>> one = Decimal(1)
>>> b = a * (a+one) * (a+one+one)
>>> c = Decimal(4) / b
>>> type(c)
<class 'decimal.Decimal'>
>>> pi = pi + c
>>> pi
Decimal('3.166666666666666666666666667')