将加载条的百分比四舍五入,但将 [99-100) 调整为 99%,将 (0, 1] 调整为 1%

Posted

技术标签:

【中文标题】将加载条的百分比四舍五入,但将 [99-100) 调整为 99%,将 (0, 1] 调整为 1%【英文标题】:Round a percentage for loading bar but snap [99-100) to 99% and (0, 1] to 1% 【发布时间】:2020-07-05 17:35:13 【问题描述】:

我有一个介于 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%)。

【问题讨论】:

这个问题类似于Rounding a percentage in Python 【参考方案1】:

这是一种方法:

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%)

如果complete 为 1,即使更接近 0,它也会打印 1%。

更完整的解决方案

遵循相同理性的更全面的解决方案会将最高 50% 的所有内容四舍五入,然后将 50 到 100% 的所有内容向下舍入:

def get_pct(complete, total):
    
    pct = (complete * 100.0 / total)
    if pct > 50: 
        pct = math.floor(pct) /100
    else:
        pct = math.ceil(pct) /100
    return pct

complete = 1
total = 1000
print(f"Completed complete out of total (get_pct(complete, total):.0%)")
#==> Completed 1 out of 1000 (1%)

complete = 999
total = 1000
print(f"Completed complete out of total (get_pct(complete, total):.0%)")
#==> Completed 999 out of 1000 (99%)

complete = 555
total = 1000
print(f"Completed complete out of total (get_pct(complete, total):.0%)")
#==> Completed 555 out of 1000 (55%)

complete = 333
total = 1000
print(f"Completed complete out of total (get_pct(complete, total):.0%)")
#==> Completed 333 out of 1000 (34%)

【讨论】:

【参考方案2】:

我是这样做的:

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%"

【讨论】:

以上是关于将加载条的百分比四舍五入,但将 [99-100) 调整为 99%,将 (0, 1] 调整为 1%的主要内容,如果未能解决你的问题,请参考以下文章

如何将值四舍五入到小数点后 3 位?

vue 保留小数点后两位以及转化为百分比

从值中减去百分比

将数字转换成百分比

如何让 JQuery 在旋转动画的循环内等待

添加四舍五入的小数百分比等于 1(或 100%)