#python #python-3.x #floating-point #decimal #rounding
Вопрос:
При работе со встроенным десятичным модулем в python я могу округлять десятичные дроби следующим образом.
Decimal(50.212345).quantize(Decimal('0.01'))
> Decimal('50.21')
Но я также могу округлить одно и то же число с помощью встроенной функции округления
round(Decimal(50.212345), 2)
> Decimal('50.21')
Почему я должен использовать одно вместо другого при округлении десятичных знаков? В предыдущих ответах о округлении десятичных знаков пользователи предлагали использовать квантование, поскольку встроенная функция округления возвращала бы значение типа float. Основываясь на моем тестировании, они оба возвращают десятичное число. Помимо синтаксиса, есть ли причина выбирать одно вместо другого?
Комментарии:
1. В документации для
round()
говорится: «для общего объекта Pythonnumber
round
делегируетсяnumber.__round__
«, поэтому не похоже, что будет какая-то разница.
Ответ №1:
Типы возвращаемых данных не всегда одинаковы. round()
используется с одним аргументом, фактически возвращает int
:
>>> round(5.3)
5
>>> round(decimal.Decimal("5.3"))
5
В остальном, как хочешь. quantize()
это особенно удобно, если вы хотите, чтобы десятичное число было округлено до «той же» точности, что и другое десятичное число, которое у вас уже есть.
>>> x = decimal.Decimal("123.456")
>>> x*x
Decimal('15241.383936')
>>> (x*x).quantize(x)
Decimal('15241.384')
Видишь? Код, выполняющий это, не должен знать, что x
изначально после десятичной точки было 3 цифры. Просто переход x
к quantize()
заставляет функцию округляться с той же точностью , что и оригинал x
, независимо от того, что это может быть.
quantize()
также необходимо, если вы хотите использовать режим округления, отличный от ближайшего/четного по умолчанию.
>>> (x*x).quantize(x, decimal.ROUND_FLOOR)
Decimal('15241.383')