JavaScript에서 정수 또는 실수(부동소수점 숫자)를 입력받아, 실수라면 소수점 이하 자릿수를 반환하고 정수라면 0을 반환하는 함수를 작성해야 하는 경우가 있습니다. 이번 글에서는 이 문제를 간단하고 효율적으로 해결하는 방법을 알아보겠습니다.
예를 들어 다음과 같은 두 개의 숫자가 있다고 가정해 보겠습니다.
const num1 = 1.123456789; const num2 = 123456789;
여기서 num1은 소수점 아래 9자리를 가진 실수이고, num2는 소수점이 없는 정수입니다. 우리가 원하는 결과는 각각 9와 0입니다.
해결 방법: 문자열 변환 활용하기
가장 직관적인 접근 방식은 숫자를 문자열로 변환한 뒤, 문자열에 소수점(.)이 포함되어 있는지 확인하는 것입니다. 소수점이 있다면 그 기준으로 문자열을 나누어 소수 부분의 길이를 측정하면 됩니다.
코드 예제
const num1 = 1.123456789;
const num2 = 123456789;
const decimalCount = num => {
// 숫자를 문자열로 변환
const numStr = String(num);
// 문자열에 소수점이 포함되어 있는 경우
if (numStr.includes('.')) {
return numStr.split('.')[1].length;
};
// 소수점이 없는 경우
return 0;
}
console.log(decimalCount(num1)) // 9
console.log(decimalCount(num2)) // 0실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력이 나타납니다.
9 0
코드 동작 원리
이 함수가 작동하는 과정을 단계별로 살펴보겠습니다.
1. 문자열 변환: String(num)을 사용하여 숫자를 문자열로 변환합니다. 이렇게 하면 문자열 메서드를 활용할 수 있습니다.
2. 소수점 확인: includes('.') 메서드로 문자열 내에 소수점이 존재하는지 검사합니다.
3. 자릿수 계산: 소수점이 존재하면 split('.')으로 문자열을 분리한 후, 두 번째 요소(소수 부분)의 length를 반환합니다.
4. 정수 처리: 소수점이 없다면 정수이므로 0을 반환합니다.
참고 사항
JavaScript의 부동소수점 연산 특성상 0.1 + 0.2 === 0.30000000000000004와 같은 부정확한 값이 발생할 수 있습니다. 따라서 계산된 결과값을 다룰 때는 이러한 부동소수점 오차를 염두에 두는 것이 좋습니다. 필요하다면 toFixed()나 Number.EPSILON 등을 활용해 정밀도 문제를 보완할 수 있습니다.