将加载条的百分比四舍五入,但将 [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%的主要内容,如果未能解决你的问题,请参考以下文章