본문 바로가기
파이썬/파이썬 기초

파이썬 반올림, 올림, 내림, 버림 - round, ceil, floor, trunc의 모든 것

by Go! Jake 2021. 6. 2.

목적

알고리즘 문제 풀이 시 숫자를 다룰 때, ~ 번째 자리에서 주로 반올림을 하고, 이 값을 구하는 문제가 있다. 또한 올림, 내림, 버림 형태는 파이썬에서 어떻게 다뤄야할 지 알아보도록 하자.

 

 

반올림(Round)

파이썬 반올림은 내장함수 round(number[, ndigits])로 number를 소수점 다음에 ndigits 정밀도로 반올림한 값을 돌려준다.

>>> round(1234.233)
1234

>>> round(1234.233,2)
1234.23

첫 번째 결과는 몇 번째 자리까지 계산할지 정하지 않았는 데, 이때는 첫 번째 자리에서 반올림하게 된다. 따라서 1234 값을 얻게 되었다.

두 번째 결과는 둘째자리까지 계산하고, 즉 셋째 자리에서 반올림하므로 1234.23이라는 결과가 나오게 되었다.

 

아래는 한 가지 주의해야 할 점으로, 1.5와 2.5의 반올림 값이 다르다는 것이다. 1.5는 2가 되었고, 2.5는 2가 되었다.

>>> round(1.5)
2   
>>> round(2.5)
2

 

이는 파이썬 계산이 Round half to even (Gaussian Rounding, Banker's Rounding) 방식을 따르기 때문이다.

즉, 중간값인 1.5, 2.5 등등은 짝수인 정수로 반올림된다.

- 1.5를 Round half to even 반올림한다면 2 (홀수인 1에 0.5인 값인 1.5의 경우 홀수에서 짝수인 정수 2로 반올림)

- 2.5를 Round half to even 반올림한다면 2 (짝수인 2에 0.5인 값인 2.5의 경우 홀수에서 짝수인 정수 2로 반올림)

물론 값이 1.4인 경우는 1로 반올림되고, 2.6인 경우는 3으로 반올림된다. 

 

그럼 왜 이러한 반올림을 사용할까?

기존 반올림 대비 Round half to even은 합과 평균을 근사할 때 편향을 줄일 수 있는 장점이 있다.

예를 들어, 나열된 수에 대해 반올림한 합 또는 평균을 구한다고 하였을 때, 0.5 값을 많이 가지는 수가 나열되었다고 하면 결과값에서 큰 차이가 난다.

e.g.) 1.5+2.5+3.5=7.5

각 숫자 1의 자리에서 반올림 하는 경우, 2+3+4=9

이 때 Round half to even 방식을 사용하면, 2+2+3=7와 같이 근사 오차를 줄일 수 있다.

따라서 파이썬 반올림은 이 방식을 채택하여 계산하고 있다고 생각하면 된다.

 

 

올림 (Ceil)

올림은 해당 값에서 양의 무한대 방향으로 가까운 정수를 선택한다.

여기서부터는 내장 함수가 아닌 math 라이브러리를 사용해야 한다. ceil() 함수를 통해 해당 값을 올림한다. 결과는 아래와 같다.

>>> import math
>>> math.ceil(1.5)
2
>>> math.ceil(-1.5)
-1

 

내림 (Floor)

내림은 해당 값에서 음의 무한대 방향으로 가까운 정수를 선택한다.

내장 함수가 아닌 math 라이브러리를 사용해야 한다. floor() 함수를 통해 해당 값을 내림한다. 결과는 아래와 같다.

>>> math.floor(1.5)
1
>>> math.floor(-1.5)
-2

 

버림(Trunc)

버림은 해당 값에서 0에 가까운 정수를 선택한다.

내장 함수가 아닌 math 라이브러리를 사용해야 한다. trunc() 함수를 통해 해당 값을 버림한다. 결과는 아래와 같다.

>>> math.trunc(1.5)
1
>>> math.trunc(-1.5)
-1

 

a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
======  ======  =====  =====  =====
  -3      -1      0      2      3   Round (기존 반올림)                
  -3       0      0      2      3   Round (Round half to even)     
  -2       0      1      2      3   Ceiling (올림)                
  -3      -1      0      1      2   Floor (내림)                  
  -2       0      0      1      2   Truncate (버림)                     

 

Reference

.net - Difference between Math.Floor() and Math.Truncate() - Stack Overflow

 

 

댓글