오늘은 자바, 코틀린에서 소수점 지정이 가능한 반올림(round), 내림(floor), 올림(ceil) 함수를 소개하려고 합니다.
반올림이라고 하면 무척 자주 쓰이는 기능이라 표준 라이브러리에서 제공하고 있을 것 같은데요, 실제로 관련 함수를 확인할 수 있습니다. 그럼 그냥 그걸 쓰면 되지 않을까 생각하실 수 있는데, 한가지 문제가 있습니다.
표준 라이브러리에서 제공하는 함수는 자릿수를 지정하는 기능이 없어 무조건 소수점 첫째 자리에서 반올림이 수행됩니다. 이 때문에 원하는 대로 쓰기 조금 불편합니다.
인터넷을 찾아보다 보니, 자릿수를 지정하는 다양한 방법을 확인할 수 있었는데, 함수 형태로 코드를 제공하는 경우는 없어서 직접 만들어보았습니다. 자바 버전과 코틀린 버전 모두 만들었으니 필요한 쪽을 사용하시면 됩니다.
먼저 소스코드를 소개하고, 그 후 원리를 설명하도록 하겠습니다.
코드 설명
// Java
double roundDigit(double number, int digits);
// Kotlin
fun roundDigit(number : Double, digits : Int): Double
모든 함수는 반올림(또는 올림, 내림)할 숫자 number와 반올림 받을 위치 digits를 인자로 받습니다. digits는 십의 자리가 -1, 일의 자리가 0, 소수점 첫째 자리가 1, 둘째 자리가 2와 같은 방식으로 지정합니다. (엑셀과 같은 방식입니다.)
예를 들어 roundDigit(123.45, -1)을 호출했다면 120.0을 리턴합니다.
각 함수에서 사용한 pow(), round(), ceil(), floor()는 모두 java.lang.Math에 포함된 함수들입니다. 기본적으로 java.lang이 포함되기 때문에, 별도의 라이브러리 import 없이 함수만 복사하여 사용 가능합니다.
반올림 함수
1. 자바 버전
// 반올림 함수
static double roundDigit(double number, int digits) {
return Math.round(number * Math.pow(10.0, (double)digits)) / Math.pow(10.0, (double)digits);
}
2. 코틀린 버전
// 반올림 함수
fun roundDigit(number : Double, digits : Int): Double {
return Math.round(number * Math.pow(10.0, digits.toDouble())) / Math.pow(10.0, digits.toDouble())
}
내림 함수
1. 자바 버전
// 내림 함수
static double roundDownDigit(double number, int digits) {
return Math.floor(number * Math.pow(10.0, (double)digits)) / Math.pow(10.0, (double)digits);
}
2. 코틀린 버전
// 내림 함수
fun roundDownDigit(number : Double, digits : Int): Double {
return Math.floor(number * Math.pow(10.0, digits.toDouble())) / Math.pow(10.0, digits.toDouble())
}
올림 함수
1. 자바 버전
// 올림 함수
static double roundUpDigit(double number, int digits) {
return Math.ceil(number * Math.pow(10.0, (double)digits)) / Math.pow(10.0, (double)digits);
}
2. 코틀린 버전
// 올림 함수
fun roundUpDigit(number : Double, digits : Int): Double {
return Math.ceil(number * Math.pow(10.0, digits.toDouble())) / Math.pow(10.0, digits.toDouble())
}
기본 원리
원리는 간단합니다. 기본으로 제공하는 함수가 소수점 첫 번째 자리에서 올림, 내림 처리를 한다는 점을 이용하는 것입니다.
요약하면, 반올림할 자릿수만큼 소수점을 이동하여, 그 상태에서 반올림한 후 다시 소수점을 되돌려놓는 것입니다.
314.159를 소수점 두 번째 자리에서 반올림하는 과정을 그림을 보면서 직접 살펴보도록 하겠습니다.
1. 남길 소수점 자릿수만큼 10의 거듭제곱을 곱하기
소수점 두 번째 자리에서 반올림한다는 것은 다시 말하면 첫 번째 자리까지 남긴다는 말과 같습니다. 따라서 10^1을 곱해줍니다. (두 번째 자리까지 남기려면 10^2를, 일의 자리, 십의 자리까지 남기려면 각각 10^0, 10^(-1)을 곱해줍니다.)
2. 반올림 함수 이용하기
이제 3141.59가 되었으므로 Math.round() 함수를 이용하여 반올림해 줍니다.
소수점 아래가 사라지므로 3142.00이 됩니다.
3. 1에서 곱한 만큼 나눠주기
곱한 만큼(10^1) 다시 나눠주게 되면 314.2가 됩니다. 따라서 314.159를 소수점 2번째 자리에서 반올림한 314.2와 같은 결과를 확인할 수 있습니다.
내림, 올림 함수 역시 같은 원리로 동작합니다. 2번에서 반올림 대신 내림이나 올림을 수행해주는 차이입니다.
테스트해본 결과도 잘 출력됩니다. (코틀린 기준)
roundDigit과 roundUpDigit은 올림 처리되었으므로 314.2가 되었고, roundDownDigit은 내림 처리되었으므로 314.1입니다.
자바, 코틀린에서 소수점 자릿수 지정하여 반올림하는 함수와 그 원리에 대해 알아보았습니다. 마냥 머릿속에서 이해하려고 하면 좀 헷갈리지 않을까 싶어서 직접 그림을 그려 설명했는데, 도움이 되었으면 좋겠습니다.
궁금한 사항이나 잘못된 내용이 있으면 댓글로 알려주세요~