217 votes

Comment imprimer une valeur en pourcentage en python ?

Voici mon code :

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

et ça se voit :

0.0%

mais je veux obtenir 33%

Qu'est-ce que je peux faire ?

12 votes

Int/int = int, int/float = float, flaot/int = float

3 votes

Pourcentage signifie par centaine . Si vous avez un rapport simple ( 1/3 dans votre cas), vous avez un par unité qu'il faut multiplier par 100 pour obtenir un pour cent valeur. Voir les autres réponses pour connaître la différence entre la division en nombres entiers et en nombres flottants.

0 votes

Pour info, dans Python 3.x print(str(float(1/3))+'%') imprimera 0.3333333333333333% - Ce n'est 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.

323voto

miku Points 63392

format soutient un pourcentage type de précision en virgule flottante :

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

Si vous ne souhaitez pas utiliser la division d'entiers, vous pouvez importer la division de Python3 à partir des éléments suivants __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 votes

Est float(1) vraiment plus python que 1. ?

0 votes

@TobiasKienzler, je ne sais pas, si c'est plus pythique. En tout cas, c'est quelque chose sur lequel on bute en lisant le code. Je pense qu'avec Python 3 et réel division par défaut, cette irritation disparaît.

0 votes

En effet. Je me demande pourquoi Guido n'a pas implémenté une vraie division dès le début... Arrondir 1/3 à 0 devrait être explicite après tout...

195voto

Sebastian Raschka Points 1056

Il existe une option de formatage en "pour cent" bien plus pratique pour les données de l'UE. .format() méthode de formatage :

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

4 votes

Y a-t-il un moyen de faire ça avec la vieille école ? "%.1f" le formatage ?

1 votes

Un peu moins "pratique", mais, oui ! Comme suggéré ci-dessus print("%.1f%%" % (100 * 1.0/3))

15 votes

C'est la meilleure réponse car elle ne nécessite pas une multiplication par 100. Elle tire plutôt avantage du fait que format sait déjà comment imprimer des pourcentages !

82voto

MestreLion Points 1789

Juste pour être complet, puisque j'ai remarqué que personne n'a suggéré cette approche simple :

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

Détails :

  • %.0f signifie " imprimer un flottant avec 0 décimale ", alors %.2f imprimerait 33.33
  • %% imprime un texte littéral % . Un peu plus propre que l'original +'%'
  • 1.0 au lieu de 1 s'occupe de contraindre la division à flotter, donc plus de 0.0

1 votes

Note : 100.0 * 1/3 -> ok, 100.0 * (1/3) -> 0.0 pas ok

0 votes

@martialdidit : Je suis conscient de cela, c'est pourquoi ma réponse ne pas ont des parenthèses dans 1/3 . L'ordre d'évaluation est intentionnel : 100.0 * 1 / 3 => 100.0 / 3 => 0.33...

0 votes

Quoi qu'il en soit, j'ai déplacé la coercition de l'option 100 à la 1 pour que les choses soient claires.

40voto

Yuji 'Tomita' Tomita Points 46106

Vous divisez des entiers puis les convertissez en flottants. Divisez plutôt par des flottants.

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

Pour spécifier une conversion et une précision en pourcentage.

>>> 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 grand bijou !

5voto

Morten Kristensen Points 4071

Alors vous devriez faire ceci à la place :

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

Le site .0 les désigne comme des flotteurs et int() les arrondit à nouveau en nombres entiers.

0 votes

Je sais que cela date de 2011 mais... int() n'arrondit pas. Par exemple int(1.9) != 2 . L'arrondi peut être fait comme suit - round(1.9,0) == 2

0 votes

int() fait certainement le tour en bas le nombre. Mon exemple fait exactement ce que je voulais qu'il fasse ; couper les chiffres puisque c'est ce que le PO voulait.

0 votes

Stockoverflow est génial - il y a deux ans et il y a toujours une réponse. Je vous remercie. Toutefois, par souci d'exhaustivité, je tiens à apporter une précision. int() fait tomber les chiffres. Il n'arrondit pas à la baisse. Arrondir implique de faire quelque chose avec les chiffres. Le résultat final est cependant le même ; en ce sens, je comprends votre point de vue. De plus, l'OP ne précise pas ce qu'il/elle veut faire avec les chiffres a 33.333... est arrondi à 33. Merci d'avoir répondu à mon commentaire et bonne journée !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X