[Python] 파이썬의 round는 이상하다.

dbdbdeep·2023년 8월 15일

백준 번호 : 18110

간단한 연산과 파이썬의 기본 문법정도만 알면 쉽게 풀리는 문제 였는데 너무 안 풀려서 좀 찾아보니 파이썬의 내장함수인 "round()"가 내 생각과는 다른 결과값을 리턴해서 정리하려한다.

뭐가 이상한가

print(round(1.5))
print(round(2.5))
print(round(2.5001))

이러한 코드를 실행 했다고 가정한다면
내가 생각하기엔 당연히 결과값은

2 3 3

이 나와야한다.
하지마 결과는

2 2 3

으로 나온다.

왜..?

우선 파이썬 공식 문서에서 round에 대한 설명에서

참고 float에 대한 round() 의 동작은 예상과 다를 수 있습니다: 예를 들어, round(2.675, 2) 는 2.68 대신에 2.67 을 제공합니다. 이것은 버그가 아닙니다: 대부분의 십진 소수가 float로 정확히 표현될 수 없다는 사실로부터 오는 결과입니다. 자세한 정보는 부동 소수점 산술: 문제점 및 한계 를 보세요.

라고한다.
정확한 원리는 모르겠지만 인터넷을 찾아보니 어느정도는 규칙은 있는 것 같다.
1. 올림 내림을 결정하는 수가 5가 아니면 그냥 올림 내림을 하면된다.
2. 만약 올림 내림을 결정하는 수가 5라면 여기서 부턴 규칙이 생긴다.

  • 기준이 되는 5의 앞 자리수가 홀수다 -> 올림
    ex) print(round(1.5)) #1.5를 올려서 2로 출력

  • 기준이 되는 5의 앞 자리수가 짝수다 -> 내림
    ex) print(round(2.5)) #2.5를 내려서 2로 출력

해결은 어떻게?

나는 그냥 이 문제에서만 잘 돌아가게끔 round를 새로 만들어서 썻다.


def newRound(num,n=1):
    num *= 10**n

    if num%10>=5:
        return int(num // 10**n +1)
    else:
        return int(num // 10**n)
profile
DB관련 공부를 합니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기