Как я могу отформатировать десятичную цифру, чтобы всегда показывать 2 десятичных знака?

Я хочу показать:

49 как 49.00

и

54.9 как 54.90

Независимо от длины десятичного числа или наличия каких-либо десятичных знаков, я хотел бы отобразить Decimal с двумя десятичными знаками, и я хотел бы сделать это эффективным способом. Цель состоит в том, чтобы отображать денежные значения.

например, 4898489.00

Ответ 1

Я полагаю, вы, вероятно, используете Decimal() объекты из decimal? (Если вам нужна ровно две цифры точности за десятичной точкой с произвольно большими числами, вы определенно должны быть, и это то, что предлагает ваш вопрос...)

Если это так, раздел Десятичный FAQ в документации содержит пару вопросов/ответов, которая может быть полезна для вас

Q. В приложении с фиксированной точкой с двумя десятичными знаками некоторые входы имеют много мест и должны быть округлены. Другие не должны иметь лишние цифры и должны быть проверены. Какие методы следует использовать?

а. Метод quantize() округляется до фиксированного числа десятичных знаков. Если установлена ​​неточная ловушка, она также полезна для проверки:

>>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
   ...
Inexact: None

Следующий вопрос гласит

Q. Как только у меня есть действующие два входа, как я могу сохранить этот инвариант во всем приложении?

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

str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'

Ответ 2

Вы должны использовать новые спецификации формата, чтобы определить, как должно быть представлено ваше значение:

>>> from math import pi  # pi ~ 3.141592653589793
>>> '{0:.2f}'.format(pi)
'3.14'

Документация иногда может быть немного тупой, поэтому я рекомендую следующие, более удобочитаемые ссылки:

В Python 3.6 введена интерполяция литеральных строк (также называемая f-строками), так что теперь вы можете написать выше еще более кратко:

>>> f'{pi:.2f}'
'3.14'

Ответ 3

Операция "Операции форматирования строк" в документации на Python содержит ответ, который вы ищете. Короче говоря:

"%0.2f" % (num,)

Некоторые примеры:

>>> "%0.2f" % 10
'10.00'
>>> "%0.2f" % 1000
'1000.00'
>>> "%0.2f" % 10.1
'10.10'
>>> "%0.2f" % 10.120
'10.12'
>>> "%0.2f" % 10.126
'10.13'

Ответ 4

Вы можете использовать оператор форматирования строк:

num = 49
x = "%.2f" % num  # x is now the string "49.00"

Я не уверен, что вы подразумеваете под "эффективным" - это почти наверняка не является узким местом вашего приложения. Если ваша программа работает медленно, сначала откройте ее, чтобы найти горячие точки, а затем оптимизируйте их.

Ответ 5

>>> print "{:.2f}".format(1.123456)
1.12

Вы можете изменить 2 в 2f на любое количество десятичных знаков, которые вы хотите показать.

РЕДАКТИРОВАТЬ:

С Python3.6 это переводится как:

>>> print(f"{1.1234:.2f}")
1.12

Ответ 6

.format - более читаемый способ обработки форматирования переменной:

'{:.{prec}f}'.format(26.034, prec=2)

Ответ 7

В Python 3, способ сделать это будет

'{:.2f}'.format(number)

Ответ 8

Если у вас есть несколько параметров, вы можете использовать

 print('some string {0:.2f} & {1:.2f}'.format(1.1234,2.345))
 >>> some string 1.12 & 2.35

Ответ 9

Самый простой пример, который покажет вам, как это сделать:

Код:

>>> points = 19.5 >>> total = 22 >>>'Correct answers: {:.2%}'.format(points/total) "

Вывод: правильных ответов: 88,64%

Ответ 10

как насчет

print round(20.2564567 , 2)    >>>>>>>        20.25


print round(20.2564567 , 4)    >>>>>>>        20.2564