Подтвердить что ты не робот

Деление десятичных знаков приводит к недействительным результатам в Python 2.5 до 2.7

После очень тщательного ознакомления с документацией по описанию десятичного модуля Python я все еще озадачен тем, что происходит, когда я делю десятину.

В 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)?

4b9b3361

Ответ 1

Из вашей ошибки MacPorts вы установили Xcode 4, а ваша версия Python 2.7.2 была построена с помощью компилятора clang C, а не gcc-4.2. Существует, по крайней мере, одна известная проблема с построением с clang в OS X, которая была исправлена ​​на Python после 2.7.2. выпуск. Либо примените патч, либо, лучше, убедитесь, что в сборке используется gcc-4.2. Что-то вроде (непроверено!):

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

до сборки может работать, если MacPorts не переопределяет его.

UPDATE: требуемый патч теперь применяется к файлам портов MacPorts для Python 2. См. https://trac.macports.org/changeset/87442

Ответ 2

Только для записи: Для python 2.7.3, скомпилированного с помощью clang (через Homebrew в 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')