2010-12-02 3 views
6

У меня есть номера, которые я хочу, чтобы перейти от:быстрый способ округление до ближайшего 5/100ths

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

Scale, круглые, 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

Смежные вопросы