Comment imprimer une valeur de pourcentage en python?

183

c'est mon code:

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

et cela montre:

0.0%

mais je veux avoir 33%

Que puis-je faire?

zjm1126
la source
11
int / int = int, int / float = float, flaot / int = float
AbiusX
3
Le pourcentage signifie pour cent . Si vous avez un ratio simple ( 1/3dans votre cas), vous avez une valeur unitaire qui doit la multiplier par 100pour obtenir une valeur en pourcentage . Voir les autres réponses pour la différence entre la division entière et flottante.
Apalala
FWIW, en Python 3.x print(str(float(1/3))+'%')imprimera 0.3333333333333333%- toujours pas exactement ce que vous voulez, mais au moins c'est un peu plus proche. C'est parce que la division fonctionne différemment dans cette version.
martineau

Réponses:

279

formatprend en charge un type de précision à virgule flottante en pourcentage :

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

Si vous ne voulez pas de division entière, vous pouvez importer la division de Python3 à partir de __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%
Miku
la source
4
Est-ce float(1)vraiment plus pythonique que 1.?
Tobias Kienzler
@TobiasKienzler, je ne sais pas, si c'est plus pythonique. Au moins, c'est quelque chose sur lequel vous trébuchez en lisant le code. Je pense qu'avec Python 3 et la vraie division par défaut, cette irritation a disparu.
miku
En effet. Je me demande pourquoi Guido n'a pas implémenté de véritable division dès le début ... Arrondir 1/3 à 0 devrait être explicite après tout ...
Tobias Kienzler
1
@TobiasKienzler Probablement parce que dans les temps anciens, Python était plus proche de C qu'aujourd'hui.
glglgl
14
Dans Python 2, j'utiliserais à la 1.0place de float(1)ou 1.. À mon humble avis, il est moins intrusif que le premier et pas aussi subtil que le second.
MestreLion
175

Il existe une option de formatage en pourcentage beaucoup plus pratique pour la .format()méthode de formatage:

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

la source
4
Existe-t-il un moyen de faire cela avec le "%.1f"formatage old school ?
Yuji 'Tomita' Tomita
1
Un peu "moins pratique", mais oui! Comme suggéré ciprint("%.1f%%" % (100 * 1.0/3))
12
C'est la meilleure réponse car elle ne nécessite pas de multiplication par 100. Elle profite plutôt du fait qu'elle formatsait déjà imprimer les pourcentages!
blambert
5
Cela devrait être la réponse acceptée. C'est beaucoup plus pythonique, utilisant des capacités intégrées pour éliminer les détails de mise en œuvre sans signification qu'une multiplication par 100 serait.
ksadowski
2
donc dans le style f-string ce seraf"{1/3.0:.1%}"
Kubas
66

Juste pour être complet, puisque je n'ai remarqué que personne ne suggérait cette approche simple:

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

Détails:

  • %.0fsignifie " imprimer un flottant avec 0 décimale ", donc %.2fimprimer33.33
  • %%imprime un littéral %. Un peu plus propre que votre original+'%'
  • 1.0au lieu de 1se charger de forcer la division à flotter, donc plus0.0
MestreLion
la source
1
note: 100.0 * 1/3 -> ok, 100.0 * (1/3) -> 0.0 pas ok
mpgn
@martialdidit: J'en suis conscient, c'est pourquoi ma réponse n'a pas de parenthèses 1/3. L'ordre d'évaluation est intentionnel:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion
En tout cas, j'ai déplacé la coercition du 100vers le 1, pour clarifier les choses.
MestreLion
2
Je vous demande pardon, @RuggeroTurra? Il s'agit de la mise en forme, au sens large qui transforme une entrée pour l'afficher sous forme de chaîne. Veuillez noter que l'OP n'a jamais nécessité l'utilisation de .format(), et que le %formatage, également connu sous le nom d' interpolation de chaîne en Python, est une alternative parfaitement valable.
MestreLion
Avec%, vous formatez un flottant en une chaîne. Pas un flottant à une chaîne de pourcentage. La multiplication par 100 se fait à la main et non par le%. Je pense que la seule solution correcte qui n'utilise que le formatage est avec {: .0%}
Ruggero Turra
38

Vous divisez des entiers puis vous les convertissez en flottant. Divisez plutôt par des flotteurs.

En prime, utilisez les méthodes de formatage de chaînes impressionnantes décrites ici: http://docs.python.org/library/string.html#format-specification-mini-language

Pour spécifier un pourcentage de conversion et de précision.

>>> 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%'

Un super bijou!

Yuji 'Tomita' Tomita
la source
18

Juste pour ajouter une solution Python 3 f-string

prob = 1.0/3.0
print(f"{prob:.0%}")
menrfa
la source
4

Ensuite, vous voudrez faire ceci à la place:

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

Le les .0dénote comme des flottants et les int()arrondit ensuite à nouveau aux nombres entiers.

Morten Kristensen
la source
je sais que cela date de 2011 mais ... int()ne tourne pas. par exemple int(1.9) != 2. L'arrondissement peut être fait comme ceci -round(1.9,0) == 2
possède
int()arrondit certainement le nombre à la baisse . Mon exemple fait exactement ce que je voulais faire; couper les chiffres puisque c'est ce que voulait l'OP.
Morten Kristensen
Stockoverflow est excellent - quelques années et toujours une réponse. Je vous remercie. Cependant, par souci d'exhaustivité, je tiens à clarifier. int()supprime les chiffres. Il n’arrondit pas. L'arrondi implique qu'il fait quelque chose avec les chiffres. Le résultat final est cependant le même; en ce sens, je comprends votre point de vue. Aussi, l'OP ne précise pas ce qu'il / elle veut faire avec les chiffres a 33,333 ... arrondit à 33. Merci d'avoir répondu à mon commentaire et bonne journée!
possède le