Проблемы с округлением десятичных дробей (python)

В моей программе очень важна точность десятичных дробей.
Многие мои вычисления должны быть точными до многих знаков после запятой (например, 50).

Поскольку я использую python, я использовал модуль decimal (with context().prec = 99. ie; Устанавливается точность 99 десятичных знаков при инстанцировании десятичного объекта)
поскольку питоновские float не позволяют и близко приблизиться к такой точности.

Поскольку я хочу, чтобы пользователь указывал точность вычислений после запятой, мне пришлось реализовать в своем коде несколько функций round().
К сожалению, встроенная функция round и объект decimal не очень хорошо взаимодействуют.

round(decimal.Decimal('2.000000000000000000001'),50)

# Number is 1e-21.   There are 21 decimal places, much less than 50.

В результате получается 2.0 вместо 2.000000000000000000001
Функция round не округляет до 50. Намного меньше!

Да, я убедился, что округление происходит не при инстанцировании объекта Decimal, а после вызова round.
В конструктор Decimal я всегда передаю строки, представляющие плавающие числа, и никогда - питонические плавающие числа.

Почему функция round так поступает со мной?
(Я понимаю, что она, вероятно, изначально была разработана для питонических полей, которые никогда не могут иметь столько десятичных знаков, но в документации утверждается, что объект Decimal прекрасно интегрируется в код python и совместим со встроенными функциями python!)

Большое спасибо!
(Это меня весьма встревожило, поскольку эта проблема подрывает использование всей программы)

Specs:
python 2.7.1
Windows 7
десятичный модуль (встроенный)

22
задан Anti Earth 15 January 2012 в 11:05
поделиться