¿Cómo imprimir un valor porcentual en python?

183

Este es mi código:

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

y eso nos muestra:

0.0%

pero quiero conseguir 33%

¿Que puedo hacer?

zjm1126
fuente
11
int / int = int, int / float = float, flaot / int = float
AbiusX
3
Porcentaje significa por cien . Si tiene una relación simple ( 1/3en su caso), tiene un valor por unidad que tiene que multiplicarlo 100para obtener un valor porcentual . Vea las otras respuestas para la diferencia entre la división entera y flotante.
Apalala
FWIW, en Python 3.x print(str(float(1/3))+'%')imprimirá 0.3333333333333333%, aún no es exactamente lo que quieres, pero al menos está un poco más cerca. Esto se debe a que la división funciona de manera diferente en esa versión.
Martineau

Respuestas:

279

formatadmite un tipo de precisión de coma flotante porcentual :

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

Si no desea la división de enteros, puede importar la división de Python3 desde __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
fuente
44
¿Es float(1)realmente más pitónico que 1.?
Tobias Kienzler
@TobiasKienzler, no sé, si es más pitónico. Al menos es algo con lo que tropiezas mientras lees el código. Creo que con Python 3 y la división real por defecto, esta irritación se ha ido.
miku
En efecto. Me pregunto por qué Guido no implementó una división real desde el principio ... El redondeo 1/3 a 0 debería ser explícito después de todo ...
Tobias Kienzler
1
@TobiasKienzler Probablemente porque en épocas anteriores, Python estaba más cerca de C que hoy en día.
glglgl
14
En Python 2, usaría en 1.0lugar de float(1)o 1.. En mi humilde opinión, es menos molesto que el primero y no tan sutil como el segundo.
MestreLion
175

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

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

fuente
44
¿Hay alguna manera de hacer esto con el "%.1f"formato de la vieja escuela ?
Yuji 'Tomita' Tomita
1
Un poco "menos conveniente", pero sí. Como se sugirió anteriormenteprint("%.1f%%" % (100 * 1.0/3))
12
Esta es la mejor respuesta porque no requiere una multiplicación por 100. ¡Más bien aprovecha el hecho de que formatya sabe imprimir porcentajes!
blambert
55
Esta debería ser la respuesta aceptada. Esto es mucho más Pythonic, usando capacidades incorporadas para eliminar el detalle de implementación sin sentido que sería una multiplicación por 100.
ksadowski
2
así que en estilo f-string seráf"{1/3.0:.1%}"
Kubas
66

Solo por completo, ya que noté que nadie sugirió este enfoque simple:

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

Detalles:

  • %.0fsignifica " imprimir un flotador con 0 decimales ", por %.2flo que imprimiría33.33
  • %%Imprime un literal %. Un poco más limpio que tu original+'%'
  • 1.0en lugar de 1hacerse cargo de obligar a la división a flotar, así que no más0.0
MestreLion
fuente
1
nota: 100.0 * 1/3 -> ok, 100.0 * (1/3) -> 0.0 no está bien
mpgn
@martialdidit: Soy consciente de eso, por eso mi respuesta no tiene paréntesis 1/3. El orden de evaluación es intencional:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion
En cualquier caso, he movido la coerción del 100al 1para dejar las cosas claras.
MestreLion
2
Perdón, @RuggeroTurra? Esto es formateo, en el sentido amplio de que transforma una entrada para mostrar como una cadena. Tenga en cuenta que el OP nunca requirió el uso .format()y el %formateo, también conocido como interpolación de cadenas en Python, es una alternativa perfectamente válida.
MestreLion
Con% está formateando un flotante en una cadena. No es un flotante a una cadena de porcentaje. La multiplicación por 100 se hace a mano, no por el%. Creo que la única solución correcta que solo usa formato es con {: .0%}
Ruggero Turra
38

Está dividiendo enteros y luego convirtiendo en flotante. Dividir por carrozas en su lugar.

Como beneficio adicional, use los increíbles métodos de formato de cadenas 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!

Yuji 'Tomita' Tomita
fuente
18

Solo para agregar la solución Python 3 f-string

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

Entonces querrás hacer esto en su lugar:

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

El los .0denota como flotadores y luego los int()redondea a enteros nuevamente.

Morten Kristensen
fuente
Sé que esto es de 2011 pero ... int()no se redondea. por ej int(1.9) != 2. El redondeo se puede hacer así:round(1.9,0) == 2
posee el
int()Ciertamente hace ronda por el número. Mi ejemplo hace exactamente lo que quise que hiciera; cortando los dígitos ya que eso era lo que quería el OP.
Morten Kristensen
Stockoverflow es excelente, un par de años y sigue siendo una respuesta. Gracias. Sin embargo, en aras de la integridad, quiero aclarar. int()deja caer los dígitos No se redondea hacia abajo. El redondeo implica que hace algo con los dígitos. Sin embargo, el resultado final es el mismo; en ese sentido, entiendo tu punto. Además, el OP no aclara qué quiere hacer con los dígitos tiene 33.333 ... se redondea a 33. ¡Gracias por responder a mi comentario y que tenga un gran día!
posee el