2017-03-19 3 views
-1

나는 이것을 알아 내려고 노력해 왔지만 운이 없었습니다. 각 계수를 가장 가까운 정수로 반올림해야합니다.파이썬 - 가장 가까운 정수로 반올림

이렇게하려면 작은 숫자 dq = 0.0001을 사용합니다. a [0] = 0.5이면 round (a [0]) = 0.0; 이것은 분명히 좋지 않습니다. 그러나이 문제를 해결하려면 dq : round (a [0] + dq) = round (0.5001) = 1.0; 이것은 좋다.

[2] = -0.5 : round (a [2] -dq) = round (-0.5001) = -1.0과 같은 네거티브의 경우. if 문을 사용하여 제외 어를 고려합니다. 이것은 올바른 값을 반환하지 않습니다 내 코드입니다 :

a= 0.5,0.5,-0.5,-0.5 
dq = 0.0001 #small number 

b = round(a[0]+dq), round(a[1]+dq), round(a[2]+dq), round(a[3]+dq) 

if a[0] < 0: 
    b[0] == round(a[0]-dq) 
if a[1] < 0: 
    b[1] == round(a[1]-dq) 
if a[2] < 0: 
    b[2] == round(a[2]-dq) 
if a[3] < 0: 
    b[3] == round(a[3]-dq) 

print(b) 

출력 :

(1,1,0,0) 

분명히 그것이 역기능 있습니다 if 문.

p.s. 나중에 계산 결과 b를 사용할 수 있어야합니다.

답변

0

아마도 더 똑똑한 방법으로 할 수 있지만 문제에 대한 빠른 해결책이 있습니다. 먼저 for 루프를 사용하여 a의 요소를 반올림합니다. 그런데 a은 터플이므로 요소를 반복 할 수 있습니다.

두 번째로, 귀하의 논리는 위의 잘못입니다. a 요소가 양수인 경우 (예 : > 0) 직접 언급 한 것처럼 빼기 대신 dq을 추가해야합니다.

In [53]: for i in a: 
    ...:  if i < 0: 
    ...:   print(round(i-dq)) 
    ...:  else: 
    ...:   print(round(i+dq)) 
    ...:   
    ...:   
1.0 
1.0 
-1.0 
-1.0 
1

아마도 당신은 그냥이 그러나

[1, 1, -1, -1] 

를 산출

a = [0.5, 0.5, -0.5, -0.5] 
print(list(map(lambda v: int(round(v + (dq if v > 0 else -dq))), a))) 

같은 것을 사용할 수, 대안은 다음과 같습니다

x = 0.49999 #just slightly less than 0.5 
round(x) 
>>> 0.0 

#first round to 2 digits and then to an "integer" 
round(round(x, 2)) 
>>> 1.0 
+0

덕분에, 나는 람다 v를 코드의 두 번째 줄을 사용하여 생각하지 않을 것이다 당신은 뭔가 새로운 일상을 배웁니다. – iknowi

0

내가 제대로 문제를 이해한다면 , 너는 n을 원해. 가장 가까운 정수로 내림 할 자연수와 가장 가까운 정수로 반올림 한 양수. 그런 경우, 당신은 math.ceilmath.floor을 사용할 수 있습니다.

import math 

def my_round(x): 
    if x < 0: 
     return math.floor(x) 
    if x >= 0: 
     return math.ceil(x) 


my_round(0.5) # 1 
my_round(-0.5) # -1