在彻底阅读 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。至少有 one known problem with building with clang在 2.7.2 之后的 Python 中已修复的 OS X 上。发布。要么应用补丁,要么更好地确保构建使用 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
