以下の例では、小数点以下 1 桁にフォーマットしたいのですが、python は数値を切り上げるのが好きなようです。数値を切り上げないようにする方法はありますか?
>>> '{:.1%}'.format(0.9995)
'100.0%'
>>> '{:.2%}'.format(0.9995)
'99.95%'
以下の例では、小数点以下 1 桁にフォーマットしたいのですが、python は数値を切り上げるのが好きなようです。数値を切り上げないようにする方法はありますか?
>>> '{:.1%}'.format(0.9995)
'100.0%'
>>> '{:.2%}'.format(0.9995)
'99.95%'
Python 3.6+ では、f-string とも呼ばれる、フォーマットされた文字列リテラルを使用できます。これらは より効率的ですstr.format
。また、 の代わりにより効率的なフロア分割を使用できますmath.floor
。私の意見では、構文も読みやすくなっています。
比較のために、両方の方法を以下に示します。
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