最快的方式到最近的5 / 100th

时间:2010-12-02 21:49:16

标签: python

我有想要的数字:

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 个答案:

答案 0 :(得分:11)

缩放,舍入,不缩放。

round(20*v)/20

我应该警告你,这种行为可能让你感到惊讶:

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

舍入工作正常,但IEEE编号不能完全代表1.35。 Python 2.7对此更加智能,并且在打印数字时将选择最简单的表示1.35。实际存储的值在2.7及更早版本中是相同的。

答案 1 :(得分: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