десятичные числа в питоне - округление до ближайшего целого доллара (без центов) - с ROUND_HALF_UP - PullRequest
3 голосов
/ 14 октября 2010

Я пытаюсь использовать 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 ]

7 голосов
/ 14 октября 2010

Я бы попробовал что-то вроде следующего:

>>> 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')

Я не вижу веских оснований отдавать предпочтение какому-либо решениюнад другим.

0 голосов
/ 17 февраля 2017

Я сделал это:

def currenctyUSD(val):
  valint = int(val)
  if float(val) > float(valint):
    valint = valint + 1
  return '{0:.2f}'.format(float(valint));

Если исходное значение с плавающей точкой больше значения с плавающей точкой (int (val)), то у исходного числа с плавающей точкой было несколько центов :), поэтому нам нужно добавить 1.

...