Как напечатать процентное значение в Python?

183

это мой код:

print str(float(1/3))+'%'

и это показывает:

0.0%

но я хочу получить 33%

Что я могу сделать?

zjm1126
источник
11
int / int = int, int / float = float, flaot / int = float
AbiusX
3
Процент означает на сотню . Если у вас есть простое соотношение ( 1/3в вашем случае), у вас есть значение на единицу, которое нужно умножить на, 100чтобы получить процентное значение. Посмотрите другие ответы для разницы между целочисленным и делением числа.
Апалала
FWIW, в Python 3.x print(str(float(1/3))+'%')напечатает 0.3333333333333333%- все еще не совсем то, что вы хотите, но, по крайней мере, это немного ближе. Это потому, что деление работает по-разному в этой версии.
Мартино

Ответы:

279

formatподдерживает процент точности с плавающей точкой :

>>> print "{0:.0%}".format(1./3)
33%

Если вам не нужно целочисленное деление, вы можете импортировать деление Python3 из __future__:

>>> from __future__ import division
>>> 1 / 3
0.3333333333333333

# The above 33% example would could now be written without the explicit
# float conversion:
>>> print "{0:.0f}%".format(1/3 * 100)
33%

# Or even shorter using the format mini language:
>>> print "{:.0%}".format(1/3)
33%
Мик
источник
4
Действительно float(1)ли более питонна, чем 1.?
Тобиас Кинцлер
@TobiasKienzler, я не знаю, является ли это более питоническим. По крайней мере, это то, что вы спотыкаетесь, читая код. Я думаю, что с Python 3 и реальным делением по умолчанию это раздражение прошло.
Мику
На самом деле. Интересно, почему Гвидо с самого начала не реализовал реальное деление ... В конце концов, округление от 1/3 до 0 должно быть явным ...
Тобиас Кинцлер
1
@TobiasKienzler Возможно, потому что в прежние времена Python был ближе к C, чем сейчас.
glglgl
14
В Python 2 я бы использовал 1.0вместо float(1)или 1.. ИМХО, это менее навязчиво, чем первое, и не так тонко, как второе.
МестреЛион
175

Существует более удобный способ форматирования в процентах для .format()метода форматирования:

>>> '{:.1%}'.format(1/3.0)
'33.3%'

источник
4
Есть ли способ сделать это с "%.1f"форматированием старой школы ?
Юджи 'Томита' Томита
1
Немного "менее удобно", но да! Как и предлагалось вышеprint("%.1f%%" % (100 * 1.0/3))
12
Это лучший ответ, потому что не требует умножения на 100. Скорее он использует тот факт, что formatуже знает, как печатать проценты!
Blambert
5
Это должен быть принятый ответ. Это гораздо более Pythonic, использующий встроенные возможности для устранения бессмысленных деталей реализации, которые были бы умножены на 100.
Ксадовский
2
так что в стиле f-string это будетf"{1/3.0:.1%}"
Кубас
66

Просто ради полноты, так как я заметил, никто не предложил этот простой подход:

>>> print("%.0f%%" % (100 * 1.0/3))
33%

Подробности:

  • %.0fозначает « печать поплавок с 0 знаков после запятой », так %.2fчто печать33.33
  • %%печатает буквальное %. Немного чище, чем ваш оригинал+'%'
  • 1.0вместо того, чтобы 1позаботиться о том, чтобы заставить дивизию плавать, так что не более0.0
MestreLion
источник
1
примечание: 100,0 * 1/3 -> хорошо, 100,0 * (1/3) -> 0,0 не в порядке
mpgn
@martialdidit: Я знаю , что именно поэтому мой ответ не не имеет скобки в 1/3. Порядок оценки является преднамеренным:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion
В любом случае, я перенес принуждение с 100того 1, чтобы прояснить ситуацию.
MestreLion
2
Прошу прощения, @RuggeroTurra? Это является форматирование, в широком смысле , что он преобразует входной сигнал для отображения в виде строки. Обратите внимание, что OP никогда не требовало использования .format(), и %-форматирование, также известное как интерполяция строк в Python, является вполне допустимой альтернативой.
МестреЛион
С помощью% вы форматируете число с плавающей точкой в ​​строку. Не плавать в процентную строку. Умножение на 100 выполняется вручную, а не на%. Я думаю, что единственное правильное решение, в котором используется только форматирование, - это {: .0%}
Ruggero Turra
38

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

В качестве бонуса используйте удивительные методы форматирования строк, описанные здесь: http://docs.python.org/library/string.html#format-specification-mini-language

Чтобы указать процент преобразования и точность.

>>> float(1) / float(3)
[Out] 0.33333333333333331

>>> 1.0/3.0
[Out] 0.33333333333333331

>>> '{0:.0%}'.format(1.0/3.0) # use string formatting to specify precision
[Out] '33%'

>>> '{percent:.2%}'.format(percent=1.0/3.0)
[Out] '33.33%'

Отличная жемчужина!

Юджи "Томита" Томита
источник
18

Просто чтобы добавить решение Python 3 f-string

prob = 1.0/3.0
print(f"{prob:.0%}")
menrfa
источник
4

Тогда вы захотите сделать это вместо:

print str(int(1.0/3.0*100))+'%'

.0Обозначает их как поплавки и int()потом снова раунды , чтобы они целые числа.

Мортен Кристенсен
источник
Я знаю, что это с 2011 года, но ... int()не округляется. например int(1.9) != 2. Округление может быть сделано так -round(1.9,0) == 2
владеет
int()конечно же округляет число. Мой пример делает именно то, что я хотел сделать; отрезать цифры, так как это то, что хотел ОП.
Мортен Кристенсен
Stockoverflow великолепен - пару лет и все равно ответ. Спасибо. Однако ради полноты хочу уточнить. int()опускает цифры. Это не округляется. Округление подразумевает, что оно что-то делает с цифрами. Конечный результат все тот же; в этом смысле я понимаю вашу точку зрения. Кроме того, ОП не разъясняет, что он / она хочет сделать с цифрами, имеет 33,333 ... делает округление до 33. Спасибо за ответ на мой комментарий и хорошего дня!
владеет