2010-11-24 4 views
11

Hvor 내가 엉 파이썬하면 다음과 라운딩을 수행 할 수 있습니다파이썬 라운드 가까운 05

라운드 가장 가까운 05 진수

7,97 -> 7,95

6,72 -> 6,70

31,06 -> 31,05

36,04 -> 36,05

5,25 -> 5,25

희망적입니다.

+0

을 내가 사용하는 대답 놀랄 것도 마법 번호 20'하지 해요 '왜 그것이 선택되었는지 설명하기가 어렵다. – martineau

+3

@martineau : 누군가 그것을 해결할 수없는 경우에 대비하여 기록 용으로 여기에 넣을 것입니다. '20 == 1/0.05' –

답변

24
def round_to(n, precision): 
    correction = 0.5 if n >= 0 else -0.5 
    return int(n/precision+correction) * precision 

def round_to_05(n): 
    return round_to(n, 0.05) 
+0

고마워요! 그게 전부! – pkdkk

+0

'round_to_05 (-1)'은 나에게 맞는 결과가 아닌'-0.95 '를 제공합니다. –

+0

사실, 자연의 숫자로 생각하고 있었는데 ... 고칠 것입니다. – fortran

12
def round05(number): 
    return (round(number * 20)/20) 

또는 더 일반적으로 :

def round_to_value(number,roundto): 
    return (round(number/roundto) * roundto) 

유일한 문제는 because you're using floats you won't get exactly the answers you want입니다 :

>>> round_to_value(36.04,0.05) 
36.050000000000004 
+1

'decimal'은 파이썬 표준 라이브러리에있는 모듈의 이름입니다. 따라서 그 이름을 사용하지 않는 것이 좋습니다. – martineau

+0

@martineau - 당신 말이 맞아요. 두 번째 인자가 소수 일 필요는 없으므로 나쁜 이름입니다. 함수를 사용하여 정수로 반올림 할 수도 있습니다. 'round_to_value (36.04,5)'는'35.0'을 제공합니다. –

+0

+1 이것은 현재 일반화 된 솔루션을 제공하는 유일한 대답이기 때문에 (이는 놀랍지 만 일반적으로 더 나은 IMHO입니다). – martineau

2

우리는 간다.

round(VALUE*2.0, 1)/2.0 

관련

+1

이 반으로 줄면 곱 해져 20으로 나누어야합니다. – fortran

2

는 여기에 하나 라이너

def roundto(number, multiple): 
    return number+multiple/2 - ((number+multiple/2) % multiple) 
-1

허용 대답의 확장입니다.

def round_to(n, precision): 
    correction = precision if n >= 0 else -precision 
    return round(int(n/precision+correction)*precision, len(str(precision).split('.')[1])) 


test_cases = [101.001, 101.002, 101.003, 101.004, 101.005, 101.006, 101.007, 101.008, 101.009] 
[round_to(-x, 0.003) for x in test_cases] 
[-101.001, -101.001, -101.001, -101.004, -101.004, -101.004, -101.007, -101.007, -101.007] 
1

당신이 원하는 방법을 정확하게에 라운드에 : 람다 함수 사용

>>> def foo(x, base=0.05): 
...  return round(base*round(x/base), 2) 

>>> foo(5.75) 
5.75 
>>> foo(5.775) 
5.8 
>>> foo(5.77) 
5.75 
>>> foo(7.97) 
7.95 
>>> foo(6.72) 
6.7 
>>> foo(31.06) 
31.05 
>>> foo(36.04) 
36.05 
>>> foo(5.25) 
5.25 
0

:

>>> nearest_half = lambda x: round(x * 2)/2 
>>> nearest_half(5.2) 
5.0 
>>> nearest_half(5.25) 
5.5 
>>> nearest_half(5.26) 
5.5 
>>> nearest_half(5.5) 
5.5 
>>> nearest_half(5.75) 
6.0