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语言辗转相除法 将十进制转换成任意进制的数 运行结果出错,与正确不符,求指导哪里出错

在 Python 中使用除法运算符时如何获得十进制值?

python函数整理

SQL0419N 十进制除法运算无效,因为结果将有一个负小数位。 SQLSTATE=42911

具有相同比率的2个数的除法结果总是相同吗?

如何计算大数之间除法的第一个十进制数字?