Skip to main content
 首页 » 编程设计

python之在 Python 2.5 到 2.7 中除以小数会产生无效结果

2025年05月04日13mq0036

在彻底阅读 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