在对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)?

最佳答案

从MacPorts错误中,您已经安装了Xcode 4,并且Python 2.7.2的版本是使用clang C编译器而不是gcc-4.2构建的。 2.7.2之后,在OS X上至少有one known problem with building with clang已在Python中修复。释放。要么应用补丁,要么更好地确保构建使用gcc-4.2。像(未经测试!)之类的东西:

sudo bash
export CC=/usr/bin/gcc-4.2
port clean python27
port upgrade --force python27

如果MacPorts不覆盖它,则构建之前的版本可能会起作用。

更新:所需的补丁现已应用于Python 2的MacPorts端口文件。请参阅https://trac.macports.org/changeset/87442

09-11 18:41
查看更多