Dans l'exemple ci-dessous, j'aimerais formater à une décimale, mais python semble aimer arrondir le nombre. Y a-t-il moyen de ne pas arrondir le nombre?
>>> '{:.1%}'.format(0.9995)
'100.0%'
>>> '{:.2%}'.format(0.9995)
'99.95%'
Merci! :)
Si vous voulez arrondir toujours (au lieu d’être arrondi à la précision la plus proche), faites-le explicitement avec la fonction 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)
Démo:
>>> 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%'
Quelque chose comme ça:
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%'
Il y a plusieurs façons, peut-être la plus facile est
x = str(10. * 0.9995).split('.')
my_string = '%s.%s%%' % (x[0], x[1][:2])
cela garantira que vous avez toujours le point décimal au bon endroit (pour les cas Edge tels que 1.0000
ou 0.001
)
Avec Python 3.6+, vous pouvez utiliser des littéraux de chaîne formatés, également appelés chaînes f. Celles-ci sont plus efficaces que str.format
. De plus, vous pouvez utiliser une division du sol plus efficace au lieu de math.floor
. À mon avis, la syntaxe est également plus lisible.
Les deux méthodes sont incluses ci-dessous à des fins de comparaison.
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