在一些国家,只允许使用5的倍数来表示分。所以,
f{money:.2f'}
只是截取了多余的数字,但还需要进一步进行四舍五入,使其成为最接近的5的倍数。
例如,
1.233333
将被格式化为
1.23
,然后四舍五入到最接近的5的倍数,即
1.25
。或者,
1.27
将变为
1.25
。
这里是我基于字符串操作的解决方案。
def cround(x:float) -> float:
"""Currency rounder"""
s = f"{x:.2f}"
i, dot, d = s.partition('.')
d1, d2 = d
if d2 in "05":
return float(s)
elif d2 in "12":
d = d1 + "0"
elif d2 in "67":
d = d1 + "5"
elif d2 in "34":
d = d1 + "5"
elif d2 in "89":
d2 = "0"
if int(d1) + 1 < 9:
d = str(int(d1) + 1) + '0'
else:
d = '00'
i = str(int(i) + 1)
return float(''.join([i, dot, d]))
ms = [1.62, 1.63, 1.67, 1.68, 2.1, 2.111, 2.119, 2.138]
ms_res = [1.60, 1.65, 1.65, 1.70, 2.1, 2.100, 2.100, 2.150]
for m, m_true in zip(ms, ms_res):
print(m, cround(m), cround(m) == m_true)
输出
1.62 1.6 True
1.63 1.65 True
1.67 1.65 True
1.68 1.7 True
2.1 2.1 True
2.111 2.1 True
2.119 2.1 True
2.138 2.15 True