MySQL의 TRUNCATE() 함수란?
TRUNCATE() 함수는 숫자 X를 소수점 D자리까지 잘라낸(truncate) 값을 반환합니다. 이 함수의 동작 방식은 다음과 같습니다.
- D가 0이면 소수점 이하를 모두 제거하고 정수 부분만 반환합니다.
- D가 음수이면 정수 부분에서 D개만큼의 자릿수를 잘라냅니다.
다음 예제를 통해 확인해 보겠습니다.
mysql> Select TRUNCATE(7.536432,2); +----------------------+ | TRUNCATE(7.536432,2) | +----------------------+ | 7.53 | +----------------------+ 1 row in set (0.00 sec)
위 예제에서 7.536432를 소수점 둘째 자리까지 자르면 7.53이 반환됩니다. 세 번째 자리 숫자(6)가 5보다 크더라도 반올림되지 않고 단순히 잘려나간다는 점에 주목하세요.
MySQL의 ROUND() 함수란?
ROUND() 함수는 숫자 X를 가장 가까운 정수로 반올림하여 반환합니다. 두 번째 인수 D가 주어지면, 소수점 D번째 자리까지 반올림한 결과를 반환합니다.
- D를 생략하면 가장 가까운 정수로 반올림됩니다.
- D가 양수여야 하며, 그렇지 않으면 소수점 오른쪽의 모든 자릿수가 제거됩니다.
다음 예제를 살펴보겠습니다.
mysql> SELECT ROUND(5.693893); +---------------------------------------------------------+ | ROUND(5.693893) | +---------------------------------------------------------+ | 6 | +---------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT ROUND(5.693893,2); +---------------------------------------------------------+ | ROUND(5.693893,2) | +---------------------------------------------------------+ | 5.69 | +---------------------------------------------------------+ 1 row in set (0.00 sec)
첫 번째 예제에서는 소수 첫째 자리의 6이 5 이상이므로 6으로 반올림되었고, 두 번째 예제에서는 소수 셋째 자리인 3이 5 미만이므로 5.69로 반올림(내림)되었습니다.
TRUNCATE()와 ROUND()의 핵심 차이점
위의 정의와 예제에서 두 함수의 차이점을 다음과 같이 정리할 수 있습니다.
- ROUND(): 두 번째 인수 D 이후의 자릿수가 5 이상인지 여부를 판단하여 숫자를 올리거나 내립니다. 즉, 일반적인 반올림 규칙을 따릅니다.
- TRUNCATE(): D번째 소수 자릿수 이후의 값이 5 이상인지 확인하지 않고 무조건 잘라냅니다. 즉, 항상 버림 처리됩니다.
실전 비교 예제
같은 숫자에 두 함수를 적용하면 차이가 더욱 명확해집니다.
mysql> Select ROUND(1.289,2) AS 'AFTER ROUND', TRUNCATE(1.289,2) AS 'AFTER TRUNCATE'; +-------------+----------------+ | AFTER ROUND | AFTER TRUNCATE | +-------------+----------------+ | 1.29 | 1.28 | +-------------+----------------+ 1 row in set (0.00 sec)
숫자 1.289를 소수점 둘째 자리까지 처리할 때 결과가 서로 다릅니다. ROUND()는 셋째 자리의 9가 5 이상이므로 1.29로 반올림하지만, TRUNCATE()는 단순히 잘라내기 때문에 1.28을 반환합니다.
어떤 상황에서 어떤 함수를 사용해야 할까?
- 금융 계산처럼 절대 반올림해서는 안 되는 경우에는 TRUNCATE()를 사용하는 것이 안전합니다.
- 일반적인 수치 표시나 통계 처리에는 직관적인 ROUND()가 적합합니다.
두 함수의 동작 방식을 정확히 이해하고 있으면 데이터 처리 시 발생할 수 있는 예기치 않은 오류를 예방할 수 있습니다.