Dividing decimals yields invalid results in Python 2.5 to 2.7

删除回忆录丶 提交于 2019-12-19 12:53:37

问题


After a very thorough read of the Python's decimal module documentation, I still find myself puzzled by what happens when I divide a decimal.

In Python 2.4.6 (makes sense):

>>> import decimal
>>> decimal.Decimal(1000) / 10
Decimal("100")

In Python 2.5.6, Python 2.6.7, and Python 2.7.2 (puzzling):

>>> import decimal
>>> decimal.Decimal(1000) / 10
Decimal('0.00000-6930898827444486144')

More confusing yet, that result doesn't even appear to be valid:

>>> 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'

The result is the same using decimal.Decimal(1000) / decimal.Decimal(10), so it's not an issue with using an int as the divisor.

Part of the issue is clearly around precision:

>>> decimal.Decimal("1000.000") / decimal.Decimal("10.000")
Decimal('0.00000-6930898827444486144')
>>> decimal.Decimal("1000.000") / decimal.Decimal("10")
Decimal('0.000200376420520689664')

But there should be ample precision in decimal.Decimal("1000.000") to divide safely by 10 and get an answer that's at least in the right ballpark.

The fact that this behavior is unchanged through three major revisions of Python says to me that it is not a bug.

What am I doing wrong? What am I missing?

How can I divide a decimal (short of using Python 2.4)?


回答1:


From your MacPorts bug, you have installed Xcode 4 and your version of Python 2.7.2 was built with the clang C compiler, rather than gcc-4.2. There is at least one known problem with building with clang on OS X that has been fixed in Python subsequent to the 2.7.2. release. Either apply the patch or, better, ensure the build uses gcc-4.2. Something like (untested!):

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

prior to the build might work if MacPorts doesn't override it.

UPDATE: The required patch has now been applied to the MacPorts port files for Python 2. See https://trac.macports.org/changeset/87442




回答2:


Just for the record: For python 2.7.3 compiled with clang (via Homebrew on OS X), this seems to be fixed.

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')


来源:https://stackoverflow.com/questions/7590137/dividing-decimals-yields-invalid-results-in-python-2-5-to-2-7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!