【发布时间】:2011-11-27 06:08:27
【问题描述】:
在彻底阅读了 Python 的 decimal module documentation 之后,我仍然对除小数时会发生什么感到困惑。
在 Python 2.4.6 中(有意义):
>>> import decimal
>>> decimal.Decimal(1000) / 10
Decimal("100")
在 Python 2.5.6、Python 2.6.7 和 Python 2.7.2 中(令人费解):
>>> import decimal
>>> decimal.Decimal(1000) / 10
Decimal('0.00000-6930898827444486144')
更令人困惑的是,该结果甚至似乎无效:
>>> decimal.Decimal('0.00000-6930898827444486144')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 548, in __new__
"Invalid literal for Decimal: %r" % value)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 3844, in _raise_error
raise error(explanation)
decimal.InvalidOperation: Invalid literal for Decimal: '0.00000-6930898827444486144'
使用decimal.Decimal(1000) / decimal.Decimal(10)的结果是一样的,所以使用int作为除数不是问题。
部分问题显然与精度有关:
>>> decimal.Decimal("1000.000") / decimal.Decimal("10.000")
Decimal('0.00000-6930898827444486144')
>>> decimal.Decimal("1000.000") / decimal.Decimal("10")
Decimal('0.000200376420520689664')
但decimal.Decimal("1000.000") 中应该有足够的精度,可以安全地除以 10 并得到至少在正确范围内的答案。
这种行为在 Python 的三个主要版本中没有改变,这对我来说这不是一个错误。
我做错了什么?我错过了什么?
如何除以小数(不使用 Python 2.4)?
【问题讨论】:
-
即使它不是一个错误,有人 可能在过去 5 年的某个时候在bugs.python.org 上打开了一个关于它的错误报告,我会在那里看看
-
好点。我在那里搜索;我搜索到的所有看起来远程相关的 fu 都是 bugs.python.org/issue7046 和 bugs.python.org/issue1031480,这两者都不是……
-
在带有 Python 2.6.6 和 2.7.1+ 的 Ubuntu 11.04 上工作正常。会不会是 macports 的问题?
-
我认为@user500198 有点意思。它适用于我在 Windows XP 上。
-
已提交 MacPorts 错误 trac.macports.org/ticket/31444。如果事件需要,将在此处更新 cmets;解决后将回答并关闭。