Десятичные числа в питоне - округление до ближайшего целого доллара (без центов) - с ROUND_HALF_UP
Я пытаюсь использовать Decimal.quantize()
добиться следующего: -
Для любой суммы денег, выраженной как десятичная дробь питона с точностью по умолчанию, я хочу округлить ее, используя decimal.ROUND_HALF_UP
так что у него нет центов после округления.
Например, учитывая 1,25, я пытаюсь получить 1,00 (что означает отсутствие центов)
учитывая 1.49 я пытаюсь получить 1,00
учитывая 1,50 я пытаюсь получить 2,00
учитывая 1,87 я пытаюсь получить 2,00
учитывая 2,00 я пытаюсь получить 2,00
Таким образом, есть два диапазона для центов - от 0 до 49 центов; и от 50 до 99 центов. Для центов до 49, я хочу округлить, для центов 50 и выше, я хочу округлить. Я пытаюсь получить результат с двумя значащими десятичными знаками (который всегда будет 00).
У меня нет никаких отрицательных значений, чтобы иметь дело здесь. Как мне округлить мои доллары, чтобы получить желаемую сумму? Также есть ли другой вариант, кроме quantize
?
2 ответа
Я бы попробовал что-то вроде следующего:
>>> from decimal import Decimal, ROUND_HALF_UP
>>> x = Decimal('2.47')
>>> x.quantize(Decimal('1'), rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')
Ключевой частью здесь является первый звонок: x.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
дает x
округляется до ближайшего целого с заданным режимом округления. Первый аргумент (Decimal('1')
) определяет показатель округленного результата, поэтому, если вы заменили его, например, Decimal('0.1')
вместо этого он округляется до десятых, и если вы замените его на Decimal('1e1')
это будет округлять до ближайшего кратного 10
,
Потом второй quantize
вызов просто помещает дополнительные два знака после запятой обратно, чтобы вы получили Decimal('2.00')
выходит вместо просто Decimal(2)
,
Вы также можете использовать to_integral_value
метод вместо первого вызова квантования, если вы хотите:
>>> x.to_integral_value(rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')
Я не вижу какой-либо веской причины предпочитать одно решение другому.
Я сделал это:
def currenctyUSD(val):
valint = int(val)
if float(val) > float(valint):
valint = valint + 1
return '{0:.2f}'.format(float(valint));
Если исходное значение с плавающей точкой больше значения с плавающей точкой (int(val)), то у исходного числа с плавающей точкой было несколько центов:), поэтому нам нужно добавить 1.