Деление десятичных знаков приводит к недействительным результатам в 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)?
Ответы
Ответ 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')