- Фиксированное количество знаков после запятой в Python
- Ответы (7 шт):
- Форматирование чисел в Python
- Форматирование чисел с округлением
- Вывод числа с разбивкой на разряды
- Вывод числа в процентах
- Заключение
- 1 комментарий к “Форматирование чисел в Python”
- Строковый оператор форматирования
- А какие бывают?
- Синтаксис
- Задаём точность чисел с дробной частью
- Вывод символа по номеру
- Вывод целочисленных значений
- Вставка в строку значений через ключ словаря
- Вывод данных в поля заданной ширины
- Список модификаторов формата
Фиксированное количество знаков после запятой в Python
Есть ли в python аналог функции toFixed() в JS? Мне нужно что-то вроде этого:
>>> a = 12.3456789 >>> a.toFixed(2) '12.35' >>> a.toFixed(0) '12' >>> b = 12.000001 >>> b.toFixed(3) '12.000'
Ответы (7 шт):
Вот так можно указать количество знаков после запятой при выводе:
a = [1000, 2.4, 2.23456754323456, 2754.344] for i in a: print('%.3f' % i) # 3 знака после запятой
1000.000 2.400 2.235 2754.344
Прямого аналога нет. Можно попробовать
>>> x = 3.1234567 >>> x = float(''.format(x)) >>> x 3.123
def toFixed(f: float, n=0): a, b = str(f).split('.') return '<>.<><>'.format(a, b[:n], '0'*(n-len(b))) f = 7.123 print(toFixed(f, 10)) # 7.1230000000 print(toFixed(f, 2)) # 7.12
def toFixed(numObj, digits=0): return f"f>"
>>> numObj = 12345.6789 >>> toFixed(numObj) '12346' >>> toFixed(numObj, 1) '12345.7' >>> toFixed(numObj, 6) '12345.678900' >>> toFixed(1.23e+20, 2) '123000000000000000000.00' >>> toFixed(1.23e-10, 2) '0.00' >>> toFixed(2.34, 1) '2.3' >>> toFixed(2.35, 1) '2.4' >>> toFixed(-2.34, 1) '-2.3'
Я для этого использую встроенный модуль. Понятно, что он возвращает Decimal, но я потом обратно преобразую во float.
from decimal import Decimal number = Decimal('0.424242') number = number.quantize(Decimal('1.000')) number = float(number) # возвращает true, т.к. оба типа данных теперь float print( 0.424 == number )
Мне кажется что вы слегка усложняете. Есть чудесная функция round(), в которую в можете передать число, а через запятую передать количество знаков после. Так как всё равно там будет округление
если нужно не округлить, а именно обрезать знаки после запятой n = float(input())
a=input() print(float(a[:5])) #если заранее известно количество знаков
Форматирование чисел в Python
Форматирование строк на самом деле является удивительно большой темой, и у Python есть собственный внутренний мини-язык для обработки множества доступных нам параметров форматирования. В этой статье мы разберем только форматирование чисел. Вы узнаете, как вывести число с нужным количеством знаков после запятой и с разбивкой по три цифры.
Форматирование чисел с округлением
Сначала давайте рассмотрим форматирование чисел с плавающей запятой до заданного уровня округления. Есть два способа сделать это: можно указать нужное количество значащих цифр в целом или количество значащих цифр после десятичной точки. Начнем с первого.
Чтобы указать уровень точности округления, нам нужно использовать двоеточие (:), за которым следует десятичная точка, а также некоторое целое число, представляющее степень точности (количество знаков после запятой). При использовании f-строки мы помещаем всё это после значения, которое хотим отформатировать (в фигурных скобках) . Вместо этого также можно использовать метод format.
x = 4863.4343091 # пример числа с плавающей запятой print(f"") # использование f-строки print("".format(x)) # использование метода format
В обоих случаях мы получаем одинаковый результат: 4863.43.
Как видите, наше довольно длинное число сократилось до шести цифр. Также следует отметить, что данная операция форматирования может производить еще и округление. Если, например, первоначальное число будет иметь значение 4863.435, то выведем в консоль мы 4863.44. Здесь используется округление до ближайшего четного числа (в английском языке banker’s rounding — «округление банкира»).
Если мы укажем меньше цифр, чем у нас есть в целочисленной части нашего числа с плавающей запятой, то получим экспоненциальное представление:
x = 4863.4343091 print(f"") # 4.86e+03
4.86e+03 означает 4,86 x 10³, или 4,86 x 1000, что равно 4860. Глядя на этот результат, мы видим, что получили три значащих цифры, как и хотели.
Итак, а как нам указать три десятичных знака после запятой? Для этого нужно просто добавить f .
x = 4863.4343091 print(f"") # 4863.434
f в данном случае указывает, что наше число типа float должно отображаться как «число с фиксированной точкой». То есть нам нужно определенное количество десятичных знаков. Мы также можем использовать f без числа, что по умолчанию означает точность 6 цифр после точки:
x = 4863.4343091 print(f"") # 4863.434309
Вывод числа с разбивкой на разряды
Большие числа зачастую удобно писать с использованием символов-разделителей (обычно это запятые, пробелы или точки). Это улучшает их восприятие при чтении. В Python мы можем указать, каким символом разбить цифры числа на классы, указав нужный символ после двоеточия:
x = 1000000 print(f"") # 1,000,000 print(f"") # 1_000_000
При форматировании чисел с плавающей запятой и форматировании с округлением это тоже работает:
x = 4863.4343091 print(f"") # 4,863.434 print(f"") # 4_863.434
Вывод числа в процентах
Мы можем вывести число в качестве процентного значения, просто добавив символ % в конце параметров форматирования вместо f :
questions = 30 correct_answers = 23 print(f"You got correct!") # You got 76.67% correct!
При форматировании числа в процентах точность округления всегда относится к количеству цифр после точки.
Заключение
Вот и все! Мы разобрали самые ходовые способы вывода чисел в нужном формате. Теперь вы знаете, как ограничить количество цифр в выводимом числе, количество знаков в дробной части числа, как вывести число в удобном для чтения виде и в виде процентного значения.
1 комментарий к “Форматирование чисел в Python”
Строковый оператор форматирования
Основы
Не смотря на один из принципов Python, гласящий: «Должен существовать один — и, желательно, только один – очевидный способ сделать что-то», в нашем любимом языке есть аж четыре способа отформатировать строку. Так сложилось исторически.
Это первый урок цикла, посвящённого форматированию строк. В него входят:
В данном уроке мы познакомимся со строковым оператором форматирования.
А какие бывают?
Сперва, в Пайтоне был строковый оператор форматирования, который имитировал функцию printf из языка C, на котором, как известно, написан сам Питон. Затем, в версии Пайтона 3.0 появился строковый метод format(), обладающий более широким и гибким синтаксисом. Но этот способ оказался самым медленным. Позже, в версии 3.6 были созданы f-Строки (PEP 498). Главная их задача — встраивать выражения в строковые литералы с использованием минимального синтаксиса. Скорость же здесь на высоте. Кроме того, в стандартной библиотеке, в модуле string есть класс Template, реализующий более простой способ форматирования строк. Если взять за 100% продолжительность работы самого медленного способа (метод format()), то получится примерно следующее распределение скоростей:
Синтаксис
Строки в Python содержат уникальную встроенную операцию, доступ к которой можно получить через оператор %. Оператор % по отношению к строкам выполняет операцию форматирования и вставки таким образом, что объект, стоящий справа от него, встраивается согласно определенным правилам в строку слева от него. Если вы когда-либо работали с функцией printf в С, вы сразу узнаете, как это работает. Вот простой пример:
print('2 * 2 = %s' % (2 * 2)) # Вывод: 2 * 2 = 4print('2 * 2 = %s' % 2 * 2) # Вывод: 2 * 2 = 22 * 2 = 2Как уже говорилось выше, данный способ форматирования пришёл в Питон из языка C, а именно, является прямым заимствованием функции printf(). Конечно, сейчас уже есть более удобные и быстрые методы форматирования, однако в некоторых ситуациях использование оператора % может быть удобнее, чем использование строкового метода format(). Кроме того, полезно знать об этом способе при чтении старых программ.
Важно понимать, что форматируются сами строки, а не вывод, как в случае с функцией print(). На вывод передается уже сформированная строка.Задаём точность чисел с дробной частью
Оператор деления / возвращает вещественное число. Если количество знаков бесконечно, то Python выведет его в таком виде:
print('5 / 3 =', 5 / 3) # Вывод: 5 / 3 = 1.6666666666666667Обычно требуется лишь определенное количество знаков. Для этого в строку записывают комбинацию символов, начинающуюся с %. Число после точки обозначает количество знаков после запятой. Символ f обозначает вещественный тип данных float.
print('4 / 7 =', 4 / 7) print("%.3f" % (4 / 7)) # Вывод: 4 / 7 = 0.5714285714285714 0.571print("%.3f" % 4 / 7) # Вывод: Traceback (most recent call last): File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.2\scratches\scratch.py", line 1, in print("%.3f" % 4 / 7) TypeError: unsupported operand type(s) for /: 'str' and 'int' Process finished with exit code 1print('Округляем 0.000005:', "%.5f" % (0.000005)) print('Округляем 0.000004:', "%.5f" % (0.000004)) # Вывод: Округляем 0.000005: 0.00001 Округляем 0.000004: 0.00000Вывод символа по номеру
from random import randint [print("%c" % randint(0, 9999), end=' ') for _ in range(10)] # Вывод: ऍ ⍥ ನ ᇎ ᠏ ᖹ ڹ ⍠ එВывод целочисленных значений
Если вместо символа ‘c’ использовать ‘d’, будет вставлено само целое число:
from random import randint [print("%d" % randint(0, 9999), end=' ') for _ in range(10)] # Вывод: 4113 1363 4474 1265 6116 6726 273 6761 2074 9782Вставка в строку значений через ключ словаря
print('%(15)s, %(второй).5f' % ) # Вывод: ХХ, 0.46009Вывод данных в поля заданной ширины
Бывает данные на экран надо вывести не через один пробел, а в виде таблицы. Другими словами, в полях определенной ширина, где ширина измеряется в знакоместах.
Рассмотрим пример. Допустим надо вывести числа второй строки под числами первой. Если выполнить функцию print() так:print(10, 235) print(1000, 50) # Вывод: 10 235 1000 50print("%5d%7d" % (10, 235)) print("%5d%7d" % (1000, 50)) # Вывод: 10 235 1000 50Здесь в кавычках указаны форматы данных и ширина полей. После знака % за кавычками указаны данные, которые будут подставлены вместо каждого указанного формата. Если количество форматов не совпадает с количеством данных, возникнет ошибка.
Форматы данных могут быть: d — целое число, s — строка, f — вещественное число, c — символ.
По умолчанию данные выравниваются по правому краю поля. Чтобы выровнять их по левому, достаточно поставить знак минус перед числом, обозначающим ширину поля. Пример:print("%-5d%7d" % (10, 235)) print("%-5d%7d" % (1000, 50)) # Вывод: 10 235 1000 50Список модификаторов формата
Флаг | Значение |
‘#’ | Для преобразования стоимости будет использоваться «альтернативная форма» (как определено ниже). |
‘0’ | Преобразование будет дополнено нулями для числовых значений. |
‘-‘ | Преобразованное значение остается скорректированным (отменяет ‘0’ преобразование, если указаны оба значения). |
‘ ‘ | (пробел) Перед положительным числом (или пустой строкой), полученным в результате преобразования со знаком, следует оставить пробел. |
‘+’ | Знак ( ‘+’или ‘-‘) будет предшествовать преобразованию (отменяет флаг «пробел»). |
Преобразование | Значение |
‘d’ | Знаковое целое десятичное число. |
‘i’ | Знаковое целое десятичное число. |
‘o’ | Знаковое восьмеричное число. |
‘u’ | Устаревший тип — идентичен ‘d’. |
‘x’ | Знаковое шестнадцатеричное (строчные). |
‘X’ | Знаковое шестнадцатеричное (прописное). |
‘e’ | Экспоненциальный формат с плавающей запятой (нижний регистр). |
‘E’ | Экспоненциальный формат с плавающей точкой (верхний регистр). |
‘f’ | Десятичный формат с плавающей запятой. |
‘F’ | Десятичный формат с плавающей запятой. |
‘g’ | Формат с плавающей запятой. Использует экспоненциальный формат в нижнем регистре, если показатель меньше -4 или не меньше точности, в противном случае — десятичный формат. |
‘G’ | Формат с плавающей запятой. Использует экспоненциальный формат в верхнем регистре, если показатель меньше -4 или не меньше точности, в противном случае — десятичный формат. |
‘c’ | Одиночный символ (принимает целочисленную или односимвольную строку). |
‘r’ | String (преобразует любой объект Python с помощью repr()). |
‘s’ | String (преобразует любой объект Python с помощью str()). |
‘a’ | String (преобразует любой объект Python с помощью ascii()). |
‘%’ | Никакой аргумент не преобразуется, в результате появляется ‘%’ символ. |