17자리 이상의 10진수 숫자형을 나타내야할 때 사용하는 BigInt()

BinaryWoo_dev·2024년 12월 3일
1

javascript

목록 보기
9/9

서론


프로그래머스에서 코딩테스트에서 다음과 같은 문제를 마주하였다.

언뜻 보면 흔히 사용하는 Number() 또는 parseInt() 을 사용하면 1분도 안되어 풀 수 있을 것 같지만 그렇게 할 경우, 두 번째 케이스에서 에러가 날 것이다.

결과는 예상대로 Fail... 대체 왜?

본론


Number 객체

자바스크립트 공식 홈페이지의 Number 생성자 객체에 대한 문서에 보면 다음과 같은 내용이 작성되어 있다.

JavaScript Number 타입은 Java 혹은 C#의 double 타입처럼 IEEE 754 64비트 바이너리 배정 밀도 값입니다. 즉, 분수 값을 나타낼 수 있지만 저장할 수 있는 값에는 몇 가지 제한이 있습니다. Number는 소수점 이하 17자리 정도만 유지하며 산술은 반올림의 대상이 됩니다. Number가 가질 수 있는 가장 큰 값은 1.8E308 입니다. 그보다 더 큰 값은 특별한 Number 상수인 Infinity으로 대체됩니다.

출처 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number

즉,안전하게 표현할 수 있는 정수 범위가 -(2^53 - 1) ~ 2^53 - 1(9,007,199,254,740,991) 사이로 제한된다는 의미이다.

  • Number.MAX_SAFE_INTEGER : 9,007,199,254,740,991

parseInt() 내장 메서드

그리고 parseInt() 내장 메서드에 대한 문서에는 다음과 같이 작성되어 있다.

radix (optional)
string의 진수를 나타내는 2부터 36까지의 정수입니다. 주의하세요. 기본 값이 10이 아닙니다! Number 자료형이 아닌 경우 Number로 변환합니다.

정리

즉, 정리하자면 다음과 같은 이유로 위 코딩테스트 문제의 2번째 테스트 케이스 결과가 fail 되는 원인은 다음과 같다.

  1. 각각 20, 21자릿수의 문자열인 18446744073709551615, 287346502836570928366 을 parseInt() 메서드를 사용하여 숫자형으로 변환

  2. parseInt() 메서드 내부에서 해당 문자열들을 Number 생성자를 사용하여 숫자형 값으로 변환하는 대신 9,007,199,254,740,991 ~ 9,007,199,254,740,991 범위 외의 값일 경우 나머지 자릿수를 버리고 근사값 으로 할당된다.

  3. 결과적으로 각각의 근사값인 18446744073709550000, 305793246910280479981 가 출력된다.

결론


9,007,199,254,740,991 ~ 9,007,199,254,740,991 외 범위의 숫자형 값을 정확하게 표현할 필요가 있을 경우, BigInt() 내장 메서드 함수를 대신 사용하면 된다.

profile
매일 0.1%씩 성장하는 Junior Web Front-end Developer 💻🔥

0개의 댓글