print - format python examples
Python string.format() porcentaje a un lugar decimal (4)
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 redondee el número?
>>> ''{:.1%}''.format(0.9995)
''100.0%''
>>> ''{:.2%}''.format(0.9995)
''99.95%''
¡Gracias! :)
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%''
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 sintaxis 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
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
)
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%''