Преобразуйте число с плавающей запятой до определенной точности, а затем скопируйте в строку

147

Скажем, у меня есть число с плавающей запятой 135.12345678910. Я хочу объединить это значение в строку, но только хочу 135.123456789. С помощью print я могу легко сделать это, сделав что-то вроде:

print "%.9f" % numvar

с numvarмоим исходным номером. Есть простой способ сделать это?

Pauliwago
источник
3
% именно так и делает -% не является частью функции печати, а является строкой - см. документацию по Python
michael_s

Ответы:

183

В Python <3 (например, 2.6 [см. Комментарии] или 2.7) есть два способа сделать это.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Но обратите внимание, что для версий Python выше 3 (например, 3.2 или 3.3) предпочтительнее второй вариант .

Для получения дополнительной информации о втором варианте я предлагаю эту ссылку на форматирование строк из документации Python .

А для получения дополнительной информации о первом варианте этой ссылки будет достаточно, и она содержит информацию о различных флагах .

Python 3.6 (официально выпущенный в декабре 2016 года) добавил fстроковый литерал, см. Дополнительную информацию здесь , который расширяет str.formatметод (использование фигурных скобок, что f"{numvar:.9f}"решает исходную проблему), то есть

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

решает проблему. Ознакомьтесь с ответом @Or-Duan для получения дополнительной информации, но этот метод быстрый .

HAL 9001
источник
1
вариант два должен быть newer_method_string = "{:.9f}".format(numvar)- обратите внимание на необходимость :разделения поля и форматирования. Я все равно тестировал это на 2.7.5.
Caltor 04
1
Для python 2.6 вариант два должен быть newer_method_string = "{0:.9f}".format(numvar)- обратите внимание на обязательный 0 для field_name для этой старой версии.
ttq
59

Python 3.6

Чтобы было понятно, вы можете использовать форматирование f-строки . Синтаксис у него почти такой же, как у formatметода, но он немного лучше.

Пример:

print(f'{numvar:.9f}')

Подробнее о новой строке f:

Вот диаграмма времени выполнения различных протестированных методов (из последней ссылки выше):

время исполнения

Или Дуань
источник
54

Использование round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'
шантаноо
источник
8

Это не печать, которая выполняет форматирование, это свойство строк, поэтому вы можете просто использовать

newstring = "%.9f" % numvar
Джон Ла Рой
источник
Или используйте новый стиль форматирования. valueString = "{:. 9f}". format (number)
Зарен
8

Если точность неизвестна до времени выполнения, полезен другой вариант форматирования:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'
Ю Хао
источник
4
Если вы предпочитаете использовать .format-метод, обратите внимание , что это также может быть сделано с помощью гнездовых аргументов нравится так: '{:.{n}f}'.format(numvar,n=n).
nivk
2

Чтобы установить точность с 9 цифрами, получите:

print "%.9f" % numvar

Точность возврата с двумя цифрами:

print "%.2f" % numvar 

Точность возврата с 2 цифрами и преобразованным значением с плавающей запятой:

numvar = 4.2345
print float("%.2f" % numvar) 
Теджас Танк
источник
-2

В strфункции есть ошибка. Пожалуйста, попробуйте следующее. Вы увидите «0,196553», но правильный результат - «0,196554». Поскольку значение strфункции по умолчанию - ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")
этемсулан
источник
2
Что случилось с .vs. ,? И насколько это актуально для вопроса Пауливаго?
Питер Мортенсен
@PeterMortensen Это сбивающий с толку европейский стандарт - использовать разделитель списков (он же запятая ,
:)