Come stampare un valore percentuale in Python?


183

questo è il mio codice:

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

e mostra:

0.0%

ma voglio ottenere 33%

Cosa posso fare?


11
int / int = int, int / float = float, flaot / int = float
AbiusX

3
Percentuale significa per cento . Se hai un rapporto semplice ( 1/3nel tuo caso), hai un valore per unità che deve moltiplicarlo 100per ottenere un valore percentuale . Vedi le altre risposte per la differenza tra divisione intera e float.
Apalala,

FWIW, in Python 3.x print(str(float(1/3))+'%')verrà stampato 0.3333333333333333%- ancora non esattamente quello che vuoi, ma almeno è un po 'più vicino. Questo perché la divisione funziona diversamente in quella versione.
martineau,

Risposte:


279

formatsupporta un tipo di precisione percentuale in virgola mobile :

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

Se non si desidera la divisione di numeri interi, è possibile importare la divisione di Python3 da __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)davvero più pitonico di 1.?
Tobias Kienzler,

@TobiasKienzler, non lo so, se è più pitonico. Almeno è qualcosa su cui ti imbatti durante la lettura del codice. Penso che con Python 3 e la vera divisione di default questa irritazione sia sparita.
Miku,

Infatti. Mi chiedo perché Guido non abbia implementato la vera divisione fin dall'inizio ... L'arrotondamento da 1/3 a 0 dovrebbe essere esplicito dopo tutto ...
Tobias Kienzler,

1
@TobiasKienzler Probabilmente perché in tempi precedenti, Python era più vicino a C di oggi.
glglgl,

14
In Python 2, userei 1.0invece di float(1)o 1.. IMHO è meno invadente del primo e non sottile come il secondo.
MestreLion,

175

Esiste un'opzione di formattazione 'percentuale' più conveniente per il .format()metodo di formattazione:

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

4
C'è un modo per farlo con la "%.1f"formattazione della vecchia scuola ?
Yuji 'Tomita' Tomita

1
Un po '"meno conveniente", ma sì! Come suggerito sopraprint("%.1f%%" % (100 * 1.0/3))

12
Questa è la risposta migliore perché non richiede una moltiplicazione per 100. Piuttosto sfrutta il fatto che formatgià sa come stampare le percentuali!
blambert,

5
Questa dovrebbe essere la risposta accettata. Questo è molto più Pythonic, usando le funzionalità integrate per eliminare i dettagli di implementazione insignificanti che sarebbe una moltiplicazione per 100.
ksadowski

2
così sarà in stile f-stringf"{1/3.0:.1%}"
Kubas,

66

Solo per completezza, poiché ho notato che nessuno ha suggerito questo semplice approccio:

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

Dettagli:

  • %.0fsta per " stampa un float con 0 cifre decimali ", quindi %.2fstampa33.33
  • %%stampa un letterale %. Un po 'più pulito del tuo originale+'%'
  • 1.0invece di 1occuparsi di costringere la divisione a galleggiare, quindi non di più0.0

1
nota: 100.0 * 1/3 -> ok, 100.0 * (1/3) -> 0.0 non ok
mpgn

@martialdidit: Sono consapevole di questo, è per questo che la mia risposta non non hanno parentesi 1/3. L'ordine di valutazione è intenzionale:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion,

In ogni caso, ho spostato la coercizione da 100a a 1, per chiarire le cose.
MestreLion,

2
Chiedo scusa, @RuggeroTurra? Questa è la formattazione, in senso lato che trasforma un input da visualizzare come stringa. Si noti che l'OP non ha mai richiesto l'uso .format()e %-formatting, noto anche come interpolazione di stringhe in Python, è un'alternativa perfettamente valida.
MestreLion,

Con% stai formattando un float su una stringa. Non un float in una stringa di percentuale. La moltiplicazione per 100 viene eseguita manualmente, non per%. Penso che l'unica soluzione corretta che utilizza solo la formattazione sia con {: .0%}
Ruggero Turra

38

Stai dividendo numeri interi e poi convertendoli in float. Dividi invece per float.

Come bonus, usa i fantastici metodi di formattazione delle stringhe descritti qui: http://docs.python.org/library/string.html#format-specification-mini-language

Per specificare una percentuale di conversione e precisione.

>>> 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 grande gioiello!


18

Solo per aggiungere la soluzione f-string di Python 3

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

4

Quindi vorresti fare questo invece:

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

Questi .0li indica come galleggianti e int()li arrotonda nuovamente a numeri interi.


so che questo è del 2011 ma ... int()non arrotonda. es int(1.9) != 2. L'arrotondamento può essere fatto in questo modo:round(1.9,0) == 2
possiede il

int()certamente non rotonda verso il basso il numero. Il mio esempio fa esattamente quello che intendevo fare; tagliare le cifre poiché è quello che voleva l'OP.
Morten Kristensen,

Lo stockoverflow è eccezionale: un paio di anni e ancora una risposta. Grazie. Tuttavia, per completezza, voglio chiarire. int()lascia cadere le cifre. Non arrotonda. L'arrotondamento implica che fa qualcosa con le cifre. Il risultato finale è lo stesso però; in questo senso, vedo il tuo punto. Inoltre, l'OP non chiarisce che cosa vuole fare con le cifre ha 33.333 ... fa arrotondare a 33. Grazie per aver risposto al mio commento e buona giornata!
possiede il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.