Десятичные числа в питоне - округление до ближайшего целого доллара (без центов) - с 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.

Другие вопросы по тегам