Як надрукувати відсоткове значення в python?


183

це мій код:

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

і це показує:

0.0%

але я хочу отримати 33%

Що я можу зробити?


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 та справжнім поділом за замовчуванням цього роздратування вже немає.
miku

Справді. Цікаво, чому Гуйдо не здійснив реальний поділ з самого початку ... Округлення 1/3 до 0 має бути явним, зрештою ...
Тобіас Кіенцлер

1
@TobiasKienzler Мабуть тому, що в більш ранні часи Python був ближче до C, ніж нині.
glglgl

14
У Python 2 я б використовував 1.0замість float(1)або 1.. ІМХО менш нав'язливий, ніж перший і не такий витончений, як останній.
MestreLion

175

Існує спосіб, більш зручний варіант "форматування" для .format()методу форматування:

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

4
Чи можна це зробити за допомогою "%.1f"формату старої школи ?
Yuji 'Tomita' Tomita

1
Трохи "менш зручно", але, так! Як і запропоновано вищеprint("%.1f%%" % (100 * 1.0/3))

12
Це найкраща відповідь, оскільки не потребує множення на 100. Швидше це скористається тим, що formatвже вміє друкувати відсотки!
blambert

5
Це має бути прийнятою відповіддю. Це набагато більше Pythonic, використовуючи вбудовані можливості для усунення безглуздих деталей реалізації, що було б множенням на 100.
ksadowski

2
так що в е-струнної стиль будеf"{1/3.0:.1%}"
KUBAS

66

Просто задля повноти, оскільки я помітив, що ніхто не пропонував такий простий підхід:

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

Деталі:

  • %.0fрозшифровується як " надрукувати поплавок з 0 десятковими знаками ", так %.2fби друкувався33.33
  • %%друкує літерал %. Трохи чистіше, ніж ваш оригінал+'%'
  • 1.0замість того, щоб 1піклуватися про те, щоб примусити дивізіон плавати, тож більше0.0

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? Це є форматування, в широкому сенсі , що він перетворює вхідний сигнал для відображення у вигляді рядка. Зверніть увагу, що ОП ніколи не вимагало використання .format(), і %-форматування, також відоме як струнна інтерполяція в Python, є цілком вірною альтернативою.
MestreLion

З% ви форматуєте float у рядок. Не поплавок на відсотковий рядок. Множення на 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%}")

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. Дякую за відповідь на мій коментар та чудовий день!
володіє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.