본문 바로가기
컴퓨터공학/파이썬

round(1.555,2) 는 1.55이다?

by 딩코딩코 2019. 10. 19.

round() 함수를 시험하다가 사람 참 즐겁게 하는 결과를 만났다.
(참고로 round()함수는 반올림을 해주는 python의 내장 함수다.)
다음을 보자.

a = 1.2345
round(a,2)
1.23
round(a,3)
1.234
.....띠용?

아니 왜 1.235가 아니라 1.234일까?
반올림하면 1.235가 맞는데?
해서 검색해보니 나와 같은 짓을 한 외국인이 있었다.

결론은 이렇다.
원인은 floating point, 즉 부동 소수점이다.
컴퓨터의 아주 밑바닥까지 들어가면 값은 0과 1로 이루어져 있다. 즉, 2진수로 모든 값을 표현해야 한다.
그러니 위의 a 값이 컴퓨터에는 1.23449999999999999345234119999999........ 따위와 같은 수로 저장 된다는 것이다.
다시 말해, 명확한 1.2345가 아닌 1.2345에 가장 가까운 값으로 저장되어 있는 것이다.
따라서 round(a,3)은 1.234499999를 소숫점 네번째에 자리에서 반올림 했으니 1.234가 반환되는 것이다.

내가 원래 의도하는 바로 구하고자 한다면, decimal()함수를 활용하면 된다.
a = decimal('1.2345')
round(a,3)
decimal('1.235')

그런데 더 웃긴건 이런 상황이다.
round(3.5)
4
round(4.5)
4
......왔???

이것의 이유는 그냥 python3가 .5는 가장 가까운 even number을 반환하도록 한다고 한다.

오늘도 참 즐거운 파이썬 이었다.


(같은 짓을 한 외국인의 질문: https://stackoverflow.com/questions/14249971/why-is-pythons-round-so-strange)
참고 문서: https://python.flowdas.com/tutorial/floatingpoint.html

'컴퓨터공학 > 파이썬' 카테고리의 다른 글

for 문은 인덱스 중심으로 돌아간다.  (0) 2019.10.18