[SQL] 실수 데이터 다루기 - ROUND, FLOOR, CEILING, TRUNCATE

2024. 8. 25. 01:13Language/SQL

 SQL 에 실수 데이터를 다루면서, 반올림, 올림, 버림 등의 연산이 필요할 때가 있다. 해당 기능을 함수들이 당연히 SQL 에도 구현이 되어있다. 오늘은 그 함수들에 대해서 알아보도록 하자.

 

1. 기본 문법

SELECT ROUND(컬럼명, 남길위치) 별명,
       CEILING(컬럼명) 별명,
       FLOOR(컬럼명) 별명,
       TRUNCATE(컬럼명, 남길위치) 별명
FROM 테이블명

 

 각 함수에 대한 설명은 아래와 같다.

  • ROUND : 반올림 함수, 소수점 'n+1' 번째 값에서 반올림한다(n 은 지정값). 소수점 이후의 위치는 '1' 부터 시작으로 정수(1의 자리)가 '0' 의 위치라 생각하면 편하다. 만약 소수점 3번째 자리에서 반올림을 하고 싶다면 '2' 를 지정값으로 사용하면 된다.
  • CEILING : 올림 함수, 실수 데이터의 소수점 이후의 부분들을 제거하고 정수 1의 자리를 '1' 올린다. 값 타입은 그대로 실수형(DOUBLE 등) 이다. 약어로 CEIL 을 함수명으로 사용 가능하다.
  • FLOOR : 버림 함수, 실수 데이터의 소수점 이후 부분들을 버리고 정수 부분만 반환한다. 이 때 값 타입은 그대로 실수형(DOUBLE 등) 이다.
  • TRUNCATE : 버림 함수, 실수 데이터의 소수점자리를 지정한 값까지 남기고 반환한다. 만약 소수점 3번째 자리까지 남기고 싶다면 '3' 을 지정값으로 사용하면 된다(소수점 4번째 자리부터의 값은 버려진다).
Banker's rounding - MySQL ROUND 와 일반적인 반올림의 차이
 
 예상한대로 ROUND 함수 결과가 나오지 않아서 찾아 본 내용을 적는다(해당 내용은 MySQL 사용 환경에서 발생한 문제). 간혹 반올림이 생각한대로 제대로 작동하지 않는 경우가 있었다. 예로 '0.25' 를 소수점 두 번째 자리에서 반올림할 경우 예상한 '0.3' 이 아니라 '0.2' 가 출력되는 경우이다.
 
 이런 연산결과가 출력되는 이유가 있다. MySQL ROUND 함수는 Banker's rounding 이 적용되어 있기 때문, 일반적인 반올림에서 '5' 이상이라면 올림 연산을 하는 반면에 Bankers' rounding 은 '5' 이전의 값은 내림, 이상의 값은 올림하고 '1~9' 의 수에서 중간값인 '5' 의 경우에는 가장 가까운 짝수로 올림 또는 내림한다. 그래서 '0.25' 의 소수점 두 번째 자리에 해당 계산법을 적용하면 '0.2' 가 출력되고 '0.35' 의 경우 '0.4' 가 출력되는 것이다. 이러한 계산법이 생긴 이유는 상당한 금액이 오고가는 은행쪽에서는 기존의 반올림을 사용하면 은행의 이익이 상대적으로 많아질 수 있으므로 이를 방지하기 위해서라고 한다.

 

 

2. 사용 예시

 'payments' 테이블에서 각 주문별 수수료를 소수점 2번째 자리에서 반올림, 버림한 결과와 소수점 이후 부분을 올림, 버림한 결과를 보여주는 결과를 출력해 보자.

SELECT vat, ROUND(vat, 1) round_vat, TRUNCATE(vat, 1) truncate_vat,
       CEIL(vat) ceil_vat, FLOOR(vat) floor_vat
FROM payments

실수 데이터 연산 결과