2010-12-02 2 views
6

난에서 가고 싶은 수 있습니다가장 빠른 방법은 가장 가까운 5/100 분에 둥근

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

(* 참고 :.이 0이면 1/100 장소 표시해서는 안됩니다)

무엇이 가장 빠른이 방법이 있습니까?

이것은 내가 지금 무엇을 가지고, 그것은 충분히 빨리되지 않습니다 :

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 

내가 행동이 당신을 놀라게 할 수 있음을 경고한다 : 라운딩가 제대로 작동하지만, IEEE 숫자는 정확히 1.35를 대표 할 수

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

. 파이썬 2.7은 이것에 대해 더 똑똑하고 번호를 인쇄 할 때 가장 간단한 표현 인 1.35을 선택할 것입니다. 실제 저장된 값은 2.7 및 이전 버전과 동일합니다.

+2

숫자에'str()'을 사용하면 긴 십진수는 없어집니다. (또는 % f 또는'.format()'을 사용하여 길이를 명시 적으로 제한하십시오.) –

+2

Python 2.6에서'1.35'를 입력하면'1.3500000000000001'이됩니다. Python 2.7과 Python 3.x에서 업데이트 된 알고리즘은'1.35'를 제공합니다. –

+0

@Brandon, @Sven : 해당 발언에 감사드립니다. 그들은 정말로 내 대답을 마무리하는 데 도움이됩니다. (미안하지만, 저는 스스로 도울 수 없었습니다). P.S .: "감사합니다"는 진짜입니다. –

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

다운 유권자에게 :이 표현식은 정확합니다. 그러나 그것이 싫어하는 이유는 그것이 싫어하는 이유입니다. 그것은 자신의 이익을 위해 너무 영리합니다. –

+1

@Marcelo : 나는 더 자연스럽고 전혀 영리하지 않다고 생각했지만, 사람들이 내가하는 방식을 생각하지 않는다는 사실에 익숙해졌습니다. –

+1

나는 이것에 대해서도 때때로 죄가있다. 나는 (a == 2)^(b == 3)^(c == 4)'때문에 뽑혔다. 왜냐하면 비트 단위 연산자는 "부울 타입에 적용해서는 안된다". 물론''(a == 2)! = (b == 3)! = (c == 4)'(파이썬에서는'False^False^True' 'False! = False! = True'와 같지 않지만 C++에서는 때때로 이것을합니다). –

관련 문제