2011-09-28 61 views
12

经过对Python的decimal module documentation进行了非常全面的阅读后,我仍然发现自己对分数小数时会发生什么感到困惑。将小数点除以2.5得出无效结果2.7到2.7

在Python 2.4.6(有意义):

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

在Python 2.5.6,2.6.7的Python和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的最小值)?

+0

即使它不是一个错误,_someone_可能已经在一些点,在过去5年http://bugs.python.org开了大约一个bug报告,我想看看有 – agf

+0

好点。我在那里搜索;我所有搜索功能看起来是远程相关的http://bugs.python.org/issue7046和http://bugs.python.org/issue1031480,这两者都不是这样的... –

+3

在Ubuntu上适用于我11.04与Python 2.6.6和2.7.1+。它可能是一个macports问题? – user500198

回答

7

从您的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的不覆盖它。

UPDATE:所需要的补丁现在已经应用到用于Python 2. MacPorts的端口文件见https://trac.macports.org/changeset/87442

+0

我认为这是追求的正确轨道。但是,我试过导出CC,CXX和CPP =/usr/bin/gcc-4.2,但还没有任何运气。 https://trac.macports.org/wiki/UsingTheRightCompiler表明我可能会做一些额外的挖掘。将继续在此工作... –

+2

作为参考,设置编译器的工作方式是'configure.compiler gcc-4.2' - 请参阅https://trac.macports.org/ticket/31444#comment: 8。 –

0

只是为了记录: 对于Python 2.7.3编译铛(通过自制软件在OS X),这似乎是固定的。

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