我有一个浮点数在0到1(含)之间,并按百分比打印:
complete = 999
total = 1000
print(f"Completed {complete} out of {total} ({complete / total:.0%})")
但是当我真的接近(但不是很接近)100%时,它会跳开枪并打印100%,这不是用户在加载屏幕中所期望的:
Completed 999 out of 1000 (100%)
我希望以上所说的99%,即使它确实将舍入至100%。同样,如果我完成了1/1000,我想说的是我完成了1%,而不是什么都没有(0%)。
答案 0 :(得分:1)
这里是一种方法:
height
输出:
complete = 999
total = 1000
pct = math.floor(complete * 100.0/total)/100
if complete / total >= 0.001:
pct = max(pct, 0.01)
print(f"Completed {complete} out of {total} ({pct:.0%})")
如果Completed 999 out of 1000 (99%)
为1,即使它更接近0,也会打印1%。
遵循相同原理的更全面的解决方案将对所有达到50%的内容取整,然后对从50%到100%的所有内容取整:
complete
答案 1 :(得分:0)
这是我的做法:
def format_loading_percent(f, ndigits=0):
"""Formats a float as a percentage with ndigits decimal points
but 0.001 is rounded up to 1% and .999 is rounded down to 99%."""
limit = 10 ** -(ndigits + 2)
if limit > f > 0:
f = limit
if 1 > f > (1 - limit):
f = 1 - limit
return f"{f:.{ndigits}%}"
用法示例:
format_loading_percent(0.01) # '1%'
format_loading_percent(0.001) # '1%'
format_loading_percent(0.000001, ndigits=2) # '0.01%'
format_loading_percent(0.999) # '99%'
format_loading_percent(0.995) # '99%'
format_loading_percent(0.991) # '99%'
编辑:,再三考虑,打印<1%
和>99%
更为正确:
def format_loading_percent(f, ndigits=0):
limit = 10 ** -(ndigits + 2)
if limit > f > 0:
return f"<{limit:.{ndigits}%}"
if 1 > f > (1 - limit):
return f">{1 - limit:.{ndigits}%}"
return f"{f:.{ndigits}%}"