将数字四舍五入到最接近的5/100的最快方法

6 投票
2 回答
1553 浏览
提问于 2025-04-16 07:57

我有一些数字,我想把它们转换成:

1.215145156155 => 1.2
1.368161685161 => 1.35
1.578414616868 => 1.6

(*注意:如果百分位是零,就不需要标记它。)

有没有什么最快的方法来做到这一点?

这是我现在的做法,但速度不够快:

def rounder(v):
    v = str(round(float(v),2))
    if len(v) == 3: v = v + str(0)
    d0 = int(v[0])#ones
    d1 = int(v[2])#tenths
    d2 = int(v[3])#hundredths
    if d2 <= 4:
        return str(d0)+'.'+str(d1)
    elif 4 < d2 < 7:
        return str(d0)+'.'+str(d1)+str(5)
    elif d2 >= 7:
        if d1 != 9:
            return str(d0)+'.'+str(d1+1)
        if d1 == 9:
            return str(d0+1)+'.'+str(0)

2 个回答

3

我会试试这个

round(v * 2, 1) / 2

应该会很快。 另外一个建议的变体

round(v * 20) / 20

似乎甚至还稍微快一点:

$ python -mtimeit "round(1.368161685161 * 2, 1) / 2"
1000000 loops, best of 3: 0.291 usec per loop
$ python -mtimeit "round(1.368161685161 * 20) / 20"
1000000 loops, best of 3: 0.248 usec per loop
11

缩放、四舍五入、反缩放。

round(20*v)/20

我得提醒你,这个行为可能会让你感到意外:

>>> round(20*1.368161685161)/20
1.3500000000000001

四舍五入的功能是正常的,但IEEE数字无法准确表示1.35。Python 2.7在这方面更聪明,它在打印这个数字时会选择最简单的表示方式,也就是1.35。实际上,存储的值在2.7和之前的版本中是一样的。

撰写回答