Исправлены цифры после десятичной дроби с f-строками


320

Есть ли простой способ с помощью Python f-строк, чтобы исправить количество цифр после десятичной точки? (В частности, f-строки, а не другие параметры форматирования строки, такие как .format или%)

Например, допустим, я хочу отобразить 2 цифры после десятичного знака.

Как я могу это сделать? Скажем так

a = 10.1234

Ответы:


477

Включите спецификатор типа в ваше выражение формата:

>>> a = 10.1234
>>> f'{a:.2f}'
'10.12'

33
Ни один из найденных мной примеров форматирования f-строки, включая PEP, не показывает, что вы можете использовать спецификатор типа. Полагаю, мне следовало предположить это, но документы, вызывающие это, были бы хорошими.
GafferMan2112

Вы правы, большинство примеров не имеют спецификатора формата. В PEP шестнадцатеричный пример делает:, f'input={value:#06x}'а примеры datetime делают: {anniversary:%A, %B %d, %Y}и {date:%A}. Я думаю, что ключевое объяснение находится в разделе Эквивалентность кода .
Робо

9
О, чувак, это великолепно и просто. Почему мне понадобилось более 45 целых секунд, чтобы найти этот ответ? До игры, Google.
Мэтт Флетчер

2
также обратите внимание, что без f, если вы напишите - f '{a: .2}', он будет считать общее количество цифр, и ответ будет 10
Драко

88

Когда дело доходит до floatчисел, вы можете использовать спецификаторы формата :

f'{value:{width}.{precision}}'

где:

  • value любое выражение, которое оценивает число
  • widthуказывает количество символов, используемых в сумме для отображения, но если valueтребуется больше места, чем указано в ширине, используется дополнительное пространство.
  • precision указывает количество символов, используемых после десятичной точки

Что вам не хватает, так это спецификатор типа вашего десятичного значения. В этой ссылке вы найдете доступные типы представлений для чисел с плавающей запятой и десятичных чисел.

Вот несколько примеров использования fтипа презентации (с фиксированной точкой):

# notice that it adds spaces to reach the number of characters specified by width
In [1]: f'{1 + 3 * 1.5:10.3f}'
Out[1]: '     5.500'

# notice that it uses more characters than the ones specified in width
In [2]: f'{3000 + 3 ** (1 / 2):2.1f}' 
Out[2]: '3001.7'

In [3]: f'{1.2345 + 4 ** (1 / 2):9.6f}'
Out[3]: ' 3.234500'

# omitting width but providing precision will use the required characters to display the number with the the specified decimal places
In [4]: f'{1.2345 + 3 * 2:.3f}' 
Out[4]: '7.234'

# not specifying the format will display the number with as many digits as Python calculates
In [5]: f'{1.2345 + 3 * 0.5}'
Out[5]: '2.7344999999999997'

34

Добавление к ответу Робо: если вы хотите печатать довольно большие числа, использование тысяч разделителей может быть очень полезным (обратите внимание на запятую).

>>> f'{a*1000:,.2f}'
'10,123.40'

15

Используйте спецификаторы формата со строками f ( подробнее здесь ).

  • Вы можете контролировать количество десятичных знаков :
pi = 3.141592653589793238462643383279

print(f'The first 6 decimals of pi are {pi:.6f}.')
The first 6 decimals of pi are 3.141593.
  • Вы можете конвертировать в процентах :
grade = 29/45

print(f'My grade rounded to 3 decimals is {grade:.3%}.')
My grade rounded to 3 decimals is 64.444%.
  • Вы можете делать другие вещи, такие как печать постоянной длины :
from random import randint
for i in range(5):
    print(f'My money is {randint(0, 150):>3}$')
My money is 126$
My money is   7$
My money is 136$
My money is  15$
My money is  88$
  • Или даже распечатать через запятую разделитель тысяч :
print(f'I am worth {10000000000:,}$')
I am worth 10,000,000,000$

1
a = 10.1234

print(f"{a:0.2f}")

в 0.2f:

  • 0 говорит Python не устанавливать никаких ограничений на общее количество отображаемых цифр
  • .2 говорит, что мы хотим взять только 2 цифры после десятичной дроби (результат будет таким же, как функция round ())
  • F говорит, что это число с плавающей точкой. Если вы забудете f, то после десятичной запятой будет напечатана на 1 цифра меньше. В этом случае это будет только 1 цифра после десятичной дроби.

Подробное видео на f-строку для номеров https://youtu.be/RtKUsUTY6to?t=606


-2

Для округления ...

import datetime as dt
now = dt.datetime(2000, 1, 30, 15, 10, 15, 900)
now_mil = round(now.microsecond/1000)
print(f"{now:%Y/%m/%d %H:%M:%S.}{now_mil:03}")

Выход: 2000/01/30 15: 10: 15.001


это не имеет ничего общего с вопросом, и эта учетная запись не была активна с момента публикации
Николя Жерве
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.