Python string.format () porcentaje a un lugar decimal

En el siguiente ejemplo, me gustaría formatear con 1 decimal, pero parece que a Python le gusta redondear el número, ¿hay alguna forma de que no se redondee el número?

>>> '{:.1%}'.format(0.9995) '100.0%' >>> '{:.2%}'.format(0.9995) '99.95%' 

¡Gracias! 🙂

Si desea redondear hacia abajo siempre (en lugar de redondear a la precisión más cercana), hágalo explícitamente con la función math.floor() :

 from math import floor def floored_percentage(val, digits): val *= 10 ** (digits + 2) return '{1:.{0}f}%'.format(digits, floor(val) / 10 ** digits) print floored_percentage(0.995, 1) 

Manifestación:

 >>> from math import floor >>> def floored_percentage(val, digits): ... val *= 10 ** (digits + 2) ... return '{1:.{0}f}%'.format(digits, floor(val) / 10 ** digits) ... >>> floored_percentage(0.995, 1) '99.5%' >>> floored_percentage(0.995, 2) '99.50%' >>> floored_percentage(0.99987, 2) '99.98%' 

Algo como esto:

 def my_format(num, x): return str(num*100)[:4 + (x-1)] + '%' >>> my_format(.9995, 1) '99.9%' >>> my_format(.9995, 2) '99.95%' >>> my_format(.9999, 1) '99.9%' >>> my_format(0.99987, 2) '99.98%' 

Hay un par de maneras, tal vez la más fácil es

 x = str(10. * 0.9995).split('.') my_string = '%s.%s%%' % (x[0], x[1][:2]) 

Esto asegurará que siempre tenga el punto decimal en el lugar correcto (para casos de borde como 1.0000 o 0.001 )

Con Python 3.6+, puedes usar literales de cadena con formato, también conocidos como cadenas de caracteres. Estos son más eficientes que str.format . Además, puede usar una división de pisos más eficiente en lugar de math.floor . En mi opinión, la syntax también es más legible.

Ambos métodos se incluyen a continuación para su comparación.

 from math import floor from random import random def floored_percentage(val, digits): val *= 10 ** (digits + 2) return '{1:.{0}f}%'.format(digits, floor(val) / 10 ** digits) def floored_percentage_jpp(val, digits): val *= 10 ** (digits + 2) return f'{val // digits / 10 ** digits:.{digits}f}%' values = [random() for _ in range(10000)] %timeit [floored_percentage(x, 1) for x in values] # 35.7 ms per loop %timeit [floored_percentage_jpp(x, 1) for x in values] # 28.1 ms per loop