Python 2十进制除法意外结果[重复]
Posted
技术标签:
【中文标题】Python 2十进制除法意外结果[重复]【英文标题】:Python 2 decimal division unexpected results [duplicate] 【发布时间】:2016-10-14 04:35:01 【问题描述】:我正在计算
使用python十进制模块,代码如下:
from decimal import *
getcontext().prec = 9
sum = Decimal(0)
for i in range(1,11):
sum += Decimal(1/(i**4))
print sum
但是,这会输出 1,而不是像我预期的那样非常小。我在https://docs.python.org/2/library/decimal.html 找不到太多关于代码有什么问题的信息。我的猜测是 sum 在循环中没有被用作小数,但我不确定如何解决。
【问题讨论】:
如果您在 Python 2 中使用 Python 3 教科书中的代码,请浏览任何有关关键差异的文章。 What's New in Python 3.0 或任何其他人。提前了解差异将为您节省数小时的头疼...... 【参考方案1】:如果您使用 Python 2.x,则在表达式:1/(i**4)
中,使用整数除法,作为结果 i=1
,它等于 1,而对于所有其他 i>1
,它得到 0。
只需将浮点数添加到 1:1./(i**4)
,这应该可以解决问题。
PS 在 Python 3.x 中,您的代码应该按预期工作,因为运算符 /
是针对浮点数定义的,而运算符 //
是针对整数定义的。
【讨论】:
是的,这是在 2.7 中完成的,我应该将其包含在问题中。感谢它在 3 中工作的花絮,我将不得不更频繁地开始使用 3。【参考方案2】:首先,不要使用sum
作为变量名,因为它是内置的。
如果您期望浮点类型的答案,则有必要提供至少一个浮点数进行算术运算,这里:
s = Decimal(0)
for i in range(1,11):
s += Decimal(1./(i**4)) # dividing 1. or 1.0 instead of just 1
print s
这给出了:
1.08203658
【讨论】:
啊,谢谢你成功了。不知道 sum 或需要包含浮点数。感谢您的快速答复,我将在 7 分钟内接受它 @kalenpw:请注意,即使如此,您也无法获得Decimal
类型的全部精度,因为您只是将 float
转换为 Decimal
(之后 i> 计算)。如果你想要高精度,你需要做s += Decimal(1)/Decimal(i**4)
。以上是关于Python 2十进制除法意外结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章
c语言辗转相除法 将十进制转换成任意进制的数 运行结果出错,与正确不符,求指导哪里出错