2011-03-15 169 views
84

este es mi código:cómo mostrar Porcentaje en Python

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

y espectáculo:

0.0% 

pero quiero conseguir 33%

qué puedo hacer.

+9

int/int = int, int/float = float, flaot/int = float – AbiusX

+3

_Percent_ significa _per hundred_. Si tiene una relación simple ('1/3' en su caso), tiene un valor _per unit_ que debe multiplicarlo por' 100' para obtener un valor _percent_. Vea las otras respuestas para la diferencia entre el entero y la división de flotación. – Apalala

Respuesta

129

format es un built-in desde Python 2.6:

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

Si no desea que la división entera, puede importar la división de python3 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% 
+3

¿Es 'float (1)' realmente más pythonic que '1.'? –

+0

@TobiasKienzler, no sé, si es más pitónico. Al menos es algo con lo que te tropiezas mientras lees el código. Creo que con Python 3 y la división * real * por defecto, esta irritación desaparece. – miku

+0

De hecho. Me pregunto por qué Guido no implementó la división real desde el principio ... Redondear 1/3 a 0 debería ser [explícita] (http://www.python.org/dev/peps/pep-0020/ "Explicit is mejor que implícito. ") después de todo ... –

-3

¿Qué tal algo como esto:

print str(round(float(1.0/3.0) * 100) )[:2] + '%' 

Este [2] poco va a rebanar el 0,0 del resultado.

+0

Actualizado para eliminar la lista de comprensión y llamada a ronda() – JeremyFromEarth

+0

Recuperado de su edición - round() es más apropiado que int() - p. Ej. considera 2.0/3.0. Y lista la comprensión, ¿qué lista de comprensión? – GreenMatt

+0

Tal vez estoy usando el término equivocado, pero pensé que [: 2] se considera una lista de comprensión, ¿no? – JeremyFromEarth

32

estás dividiendo números enteros entonces convirtiendo a flotar. Dividir por flotadores en su lugar.

Como beneficio adicional, utilice los métodos de cadenas de formato impresionantes descritos aquí: http://docs.python.org/library/string.html#format-specification-mini-language

Para especificar un porcentaje de conversión y precisión.

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

Una gran joya!

3

Entonces te gustaría hacer esto en su lugar:

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

El .0 les designa como flotadores y int() ellos se redondea a números enteros después de nuevo.

+0

sé que esto es de 2011 pero ... 'int()' no es redondo. p.ej. 'int (1.9)! = 2'. El redondeo se puede hacer de esta manera: 'round (1.9,0) == 2' – owns

+0

' int() 'ciertamente redondea _down_ el número. Mi ejemplo hace exactamente lo que quise que hiciera; cortando los dígitos ya que eso es lo que el OP quería. –

+0

Stockoverflow es genial, hace un par de años y sigue siendo una respuesta. Gracias. Sin embargo, para completar, quiero aclarar. 'int()' suelta los dígitos. No redondea hacia abajo. Redondeo implica que hace algo con los dígitos. El resultado final es el mismo sin embargo; en ese sentido, veo tu punto. Además, el OP no aclara qué quiere hacer con los dígitos tiene 33.333 ... redondea a 33. ¡Gracias por responder a mi comentario y que tenga un gran día! – owns

32

Sólo por el bien de la integridad, ya que me di cuenta de que nadie sugirió este enfoque simple:

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

Detalles:

  • %.0f significa "impresión de un flotador con 0 decimales" , entonces %.2f imprimiría 33.33
  • %% imprime un literal %.Un poco más limpio que el original +'%'
  • 1.0 en lugar de 1 se encarga de coaccionar a la división a flotar, por lo que no más 0.0
+0

nota: 100.0 * 1/3 -> bien, 100.0 * (1/3) -> 0.0 no está bien – mpgn

+0

@martialdidit: estoy al tanto de eso, es por eso que mi respuesta * no * tiene paréntesis en '1/3 '. La orden de evaluación es intencional: '100.0 * 1/3 => 100.0/3 => 0.33 ...' – MestreLion

+0

En cualquier caso, he movido la coacción del '100' al' 1', para aclarar las cosas. – MestreLion

97

Hay una manera más conveniente 'percent' de formato de opción para el método .format() formato :

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

¿Hay alguna manera de hacer esto con el formato ''% .1f '' de la vieja escuela? –

+1

Un poco "menos conveniente", pero, sí! Como se sugirió anteriormente 'print ("%. 1f %% "% (100 * 1.0/3))' – Sebastian

+3

Jeje, entonces no. Sin tipo de formato% real. –

-1

sólo hay que poner la siguiente manera:

print '%.2f%%' % 24.689 # Double percentage sign 
Cuestiones relacionadas