В моей программе очень важна точность десятичных дробей.
Многие мои вычисления должны быть точными до многих знаков после запятой (например, 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
десятичный модуль (встроенный)