【问题标题】:Dividing decimals yields invalid results in Python 2.5 to 2.7在 Python 2.5 到 2.7 中除以小数会产生无效结果
【发布时间】: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/issue7046bugs.python.org/issue1031480,这两者都不是……
  • 在带有 Python 2.6.6 和 2.7.1+ 的 Ubuntu 11.04 上工作正常。会不会是 macports 的问题?
  • 我认为@user500198 有点意思。它适用于我在 Windows XP 上。
  • 已提交 MacPorts 错误 trac.macports.org/ticket/31444。如果事件需要,将在此处更新 cmets;解决后将回答并关闭。

标签: python numbers decimal


【解决方案1】:

从您的 MacPorts 错误中,您已经安装了 Xcode 4,并且您的 Python 2.7.2 版本是使用 clang C 编译器而不是 gcc-4.2 构建的。在 OS X 上至少有 one known problem with building with clang 已在 2.7.2 之后的 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

【讨论】:

【解决方案2】:

仅作记录: 对于使用 clang 编译的 python 2.7.3(通过 OS X 上的 Homebrew),这似乎是固定的。

Python 2.7.3 (default, Oct 10 2012, 13:00:00) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import decimal
>>> decimal.Decimal(1000) / 10
Decimal('100')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2013-07-01
    • 2017-10-11
    相关资源
    最近更新 更多