В моей программе очень важна десятичная точность.
Многие из моих расчетов должны быть точными для многих десятичных знаков (например, 50).
Поскольку я использую Python, я использовал десятичный модуль
(с context (). prec = 99. т.е.; Устанавливать 99 десятичных знаков точности при создании экземпляра десятичного объекта )
так как питонические поплавки не позволяют достичь такой точности.
Поскольку я хочу, чтобы пользователь указывал десятичные знаки точности расчетов, мне пришлось реализовать несколько функций round () в моем коде.
К сожалению, встроенная функция округления и десятичный объект плохо взаимодействуют.
round(decimal.Decimal('2.000000000000000000001'),50)
# Number is 1e-21. There are 21 decimal places, much less than 50.
И все же результат равен 2,0 вместо 2.000000000000000000001
Функция округления не округляет до 50. Гораздо меньше!
Да, я убедился, что округление не происходит при создании экземпляра объекта Decimal, а после вызова раунда.
Я всегда передаю строки, представляющие числа с плавающей точкой, конструктору Decimal, а не числам с питоном.
Почему функция округления делает это со мной?
(Я понимаю, что он, вероятно, изначально был разработан для pythonic float, у которого никогда не может быть столько десятичных знаков, но в документации утверждается, что объект Decimal прекрасно интегрируется в код python и совместим со встроенными функциями python!)
Спасибо, обильно!
(Это меня очень расстраивает, так как эта проблема подрывает использование всей программы)
Технические характеристики:
питон 2.7.1
Windows 7
десятичный модуль (встроенный)