자바스크립트 숫자 소수점 이하 추출 방법
자바스크립트 소수점 추출의 기술적 기저와 한계
IEEE 754 Double Precision이 초래하는 정밀도 손실
자바스크립트에서 숫자의 소수점 이하 값을 추출하는 작업은 단순히 문자열을 자르는 수준을 넘어선다. 모든 숫자를 64비트 부동소수점(IEEE 754 Double Precision) 구조로 처리하는 언어의 고유한 특성을 반드시 고려해야 하기 때문이다. 이 구조는 컴퓨터가 2진수로 소수를 표현하는 과정에서 필연적으로 미세한 오차를 발생시킨다. 가장 대표적인 사례로 0.1과 0.2를 더하는 연산을 들 수 있다. 엄밀한 수학적 계산과 달리 자바스크립트 엔진은 0.3이라는 깔끔한 결괏값 대신 0.30000000000000004라는 미세하게 어긋난 값을 반환한다. 따라서 소수점 이하를 추출하는 과정에서 이러한 내부적인 부동소수점 오차를 사전에 필터링하지 않으면, 의도치 않게 지수 표기법(E notation)이 섞이거나 엉뚱한 결괏값이 도출되는 치명적인 문제가 발생한다.
ECMAScript 표준의 진화와 구조적 한계
과거부터 이어져 온 정밀도 문제를 해결하기 위해 ECMAScript 2020(ES11) 버전에 큰 정수를 다루는 BigInt가 공식 도입되었다. 하지만 이 자료형은 이름 그대로 정수형 연산에만 엄격하게 국한된다는 명확한 한계가 존재한다. 소수점 이하를 포함하는 실수 데이터는 여전히 처리하지 못한다. 이러한 공백을 메우기 위해 현재 자바스크립트 표준 위원회(TC39)는 10진수 고정 소수점 및 완벽한 정밀도를 지원하는 새로운 Decimal 타입 제안을 활발히 논의 중이다. 아직 Stage 2 단계에 머물고 있어 표준이 최종 확정되기 전까지는 개발자가 직접 연산 방식을 제어하여 오차를 보정해야 한다.
소수점 이하 값을 추출하는 실무 접근법
나머지 연산자와 비트 연산자를 활용한 기본 연산
가장 직관적이고 속도가 빠른 방법은 나머지 연산자를 활용하는 것이다. 숫자를 1로 나누면 정수 부분은 완벽히 나누어 떨어져 사라지고, 소수점 이하의 나머지 값만 남게 된다. 양수와 음수를 모두 포괄하려면 Math.abs(num % 1) 형태로 절대값을 취해주는 것이 필수적이다. 원래 숫자에서 소수점을 버린 정수를 빼는 수학적 접근도 자주 쓰인다. Math.trunc 메서드로 소수점 이하를 단순히 잘라낸 뒤 원래 숫자에서 빼는 방식이다. 게임이나 애니메이션처럼 연산 속도가 최우선시되는 환경에서는 비트 연산자를 사용하기도 한다. 숫자에 비트 OR 연산자를 적용해 정수 부분만 추출해 낸 뒤 빼는 방식으로, 처리 속도가 매우 빠르다. 다만 32비트를 초과하는 큰 숫자에는 비트 연산자가 제대로 작동하지 않으므로 사전에 데이터의 범위를 정확히 파악해야 한다.
toString과 Split을 이용한 문자열 변환 기법
수학적 연산이 아닌 문자열 변환을 통해 접근하는 방법도 존재한다. 숫자를 텍스트로 변환한 뒤 점을 기준으로 앞뒤를 나누는 기법이다. 나누어진 뒤쪽 배열의 값을 가져오면 순수한 소수점 이하 숫자들만 문자 그대로 추출된다. 이 방식의 가장 큰 장점은 앞서 언급한 부동소수점 연산의 복잡한 미세 오차를 원천적으로 신경 쓰지 않아도 된다는 점이다. 화면에 특정 형태로 데이터를 출력하기만 할 때 매우 유용하다. 다만 반환되는 값의 타입이 숫자가 아닌 문자열이라는 점과, 정수 부분이 없는 0.x 형태의 데이터가 들어올 경우 예외 처리 로직을 추가로 설계해야 하는 주의사항이 있다.
Number.prototype.toFixed를 활용한 자릿수 통제
부동소수점의 미세한 오차를 깔끔하게 제거하면서 소수점 이하 값을 안전하게 가져오려면 toFixed 메서드가 가장 탁월한 선택이다. 이 메서드는 원하는 소수점 자릿수를 인자로 넘겨받아 해당 자리수까지만 남기고 반올림 처리하여 문자열 형태로 반환한다. 예를 들어 소수점 2자리까지만 정확도가 필요한 데이터라면 인자로 2를 전달하면 된다. 반환된 문자열을 다시 숫자로 변환하여 사용하는 패턴을 갖추면 완벽하다. 금융, 통계, 회계 시스템처럼 데이터의 일정한 자릿수와 반올림 규칙이 엄격하게 보장되어야 하는 도메인에서는 필수적으로 사용되는 방식이다.
정밀도가 요구되는 비즈니스 로직의 안전한 구현
외부 연산 라이브러리의 필수적 역할
ECMAScript의 공식 Decimal 표준이 온전히 도입되기 전, 금융권이나 대규모 전자상거래 시스템에서는 부동소수점 오차가 곧바로 심각한 재무적 손실로 이어진다. 이러한 상용 환경에서는 decimal.js나 big.js 같은 외부 연산 라이브러리를 도입하는 것이 정석으로 평가된다. 이 라이브러리들은 숫자 데이터를 내부적으로 문자열 기반의 정수 연산으로 정밀하게 처리한다. 소수점 이하를 추출할 때 IEEE 754 구조가 만들어내는 미세 오차를 원천적으로 차단하고 수학적으로 완벽히 일치하는 실수 데이터를 반환한다. 일반적인 연산 속도보다는 데이터의 절대적인 정확도가 생명인 시스템에서는 선택이 아닌 필수다.
예외 처리 및 형변환 검증 프로세스
데이터를 다룰 때 철저한 유효성 검증은 선택이 아니다. 사용자의 직접적인 입력값이나 외부 서버의 API로 넘어온 값에는 언제나 숫자가 아닌 문자가 섞여 있거나 null, undefined가 포함될 위험이 도사리고 있다. 이런 예상치 못한 값이 연산 과정에 투입되면 NaN(Not a Number) 오류가 발생하여 전체적인 애플리케이션 로직이 멈춰버리는 대참사로 이어진다. 소수점 추출 로직을 하나의 완성된 함수로 구성할 때는 반드시 typeof 구문이나 Number.isFinite 메서드를 활용해 인자의 타입과 유한성을 최우선으로 검사해야 한다. 추출된 최종 결과값을 반환하기 직전에는 각 비즈니스 로직의 목적에 맞게 다시 숫자형으로 정확하게 파싱하는 견고한 아키텍처 설계가 요구된다.
쿠팡 파트너스 활동의 일환으로 일정 수수료를 제공받습니다
데일리 브리핑 구독
매일 아침 핵심 뉴스를 이메일로 받아보세요. 무료
