JavaScript에서는 숫자의 한계가 존재합니다.
let MaxNum = Number.MAX_SAFE_INTEGER;
console.log(MaxNum); // 결과 : 9007199254740991
Number.MAX_SAFE_INTEGER
Number.MAX_SAFE_INTEGER 상수는 JavaScript에서 안전한 최대 정수값을 나타냅니다. (2^53 - 1).
const x = Number.MAX_SAFE_INTEGER + 1;
const y = Number.MAX_SAFE_INTEGER + 2;
console.log(Number.MAX_SAFE_INTEGER); // 결과: 9007199254740991
console.log(x); // 결과: 9007199254740992
Number.MIN_SAFE_INTEGER
const min = Number.MIN_SAFE_INTEGER;
console.log(min) // 결과 : -9007199254740991
안전함이란 정수를 정확하고 올바르게 비교할 수 있음을 의미합니다.
위에서 말했듯이 JavaScript에서는 숫자의 한계가 존재하므로 Number.MAX_SAFE_INTEGER의 값보다 큰 값은 정확하지 않을 때가 많습니다.
const x = Number.MAX_SAFE_INTEGER + 1;
const y = Number.MAX_SAFE_INTEGER + 2;
console.log(x === y); // 결과: true
위 표는 ▶프로그래머스 : 두 수의 합의 문제입니다.
0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.
문자열 a와 b를 정수형으로 변환한 후 다시 문자열로 바꿔주는 방법이 있는데 이때 보통 정수형으로 변환하는 메서드인 Number() 나 parseInt() 메서드를 사용한다면 2번째 테스트 케이스가 통과하지 못합니다.
그 이유는 앞서 말했듯이 숫자의 한계가 존재하기 때문에 숫자의 한계보다 큰 값의 연산은 정확하지 않기 때문입니다.
테스트케이스 2번의 a 값을 Number.MAX_SAFE_INTEGER와 비교하면 Number.MAX_SAFE_INTEGER보다 큰 것을 알 수 있습니다.
그렇기 때문에 한계를 해결하기 위해서는 BigInt()를 사용해야 합니다.
BigInt()
BigInt 는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.
정수 뒤에 n을 붙이거나 BingInt()를 호출하여 사용할 수 있습니다.
❗ 주의해야 할 점은 BigInt() 형의 값은 BigInt() 형과만 연산이 가능하며 기본 숫자형의 값으로는 연산을 사용할 수 없습니다.
BigInt(Number.MAX_SAFE_INTEGER) + 2n; // true
BigInt(Number.MAX_SAFE_INTEGER) + 2; // false
따라서 위에서 Number()와 parseInt()로 실패했던 테스트 케이스 2번을 아래의 코드와 같이 BigInt()를 사용하여 연산할 수 있습니다.