四舍五入百分比以加载条,但将[99-100]捕捉到99%,将(0,1]捕捉到1%

时间:2020-07-05 17:35:13

标签: python number-formatting

我有一个浮点数在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%)。

2 个答案:

答案 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}%}"