2010-12-02 71 views
6

我有我想從去數字:最快的方法四捨五入到最接近的5/100分之

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) 

回答

11

規模,圓形,unscale。

round(20*v)/20 

我要提醒你的行爲可能會讓你大吃一驚:

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

舍入工作正常,但IEEE數字不能代表準確1.35。 Python 2.7更聰明,在打印數字時將選擇最簡單的表示1.35。實際存儲的值在2.7和更早版本中是相同的。

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 
+0

給羽絨服的選民:這個表達是正確的。但是它被低估的事實強調了我爲什麼不喜歡它。爲了自己的利益,這太聰明瞭。 – 2010-12-02 21:59:07

+1

@Marcelo:我認爲我的第一個表達更加自然而且不聰明,但我已經習慣了人們不認爲我這樣做的事實。 – 2010-12-02 22:07:44