[Javascript] Number()의 한계

manddu·2023년 2월 2일
post-thumbnail

배경

한가롭게 알고리즘 문제를 풀던중, 이상한 현상을 발견했다.
숫자로 이루어진 문자열을 Number()로 형변환을 했더니, 문자열의 숫자와, 형변환된 정수값이 달랐다.

  const numStr = '6145390195186705543';

  console.log('숫자로 이루어진 문자열 : ', numStr);
  // Output : '6145390195186705543'
  console.log('위 문자열을 Number()를 사용하여 형변환 : ', Number(numStr));
  // Output : 6145390195186705000

Number()의 한계

javascript의 Number()는 안전한 최대의 정수값(2^53 - 1)까지만 형변환이 가능하다.

console.log(Number.MAX_SAFE_INTEGER);
// Output: 9007199254740991

따라서 아래의 경우 integer형 값의 최대 한도까지만 형변환이 되었고, 그 뒤의 값들은 0으로 처리되었던 것이다.

9007199254740991
6145390195186705000

정수의 최댓값보다 더 큰 숫자로 형변환 필요하다면? BigInt

BigInt 는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체이다.
즉, Number형의 숫자는 15자리까지만 연산이 가능하다.

  const numStr = '6145390195186705543';

  console.log('숫자로 이루어진 문자열 : ', numStr);
  // Output : '6145390195186705543'
  console.log('위 문자열을 Number()를 사용하여 형변환 : ', BigInt(numStr));
  // Output : 6145390195186705000n
  // 참고:: BigInt 형으로 변경을 위해서는 숫자 뒤에 n을 붙이면 된다.

그럼 처음부터 BigInt로만 형변환 하면 되지 않나?

BigInt 도 한계가 있기에 주의하여 사용이 필요하다.

  • BigInt는 내장 Math 객체의 메서드와 함께 사용할 수 없다.
  • 연산에서 Number와 혼합해 사용할 수 없습니다.
  • Number 타입의 값과 연산을 위해서는 같은 자료형으로 변환해야 합니다.
  • 그러나, BigInt가 Number로 바뀌면 정확성을 잃을 수 있으니 주의해야 합니다.

그럼 연산은 못하는 BigInt?

BigInt 형의 데이터의 타입은 [bigint] 이다.

const bigInt = 6145390195186705000n;
console.log(typeof bigInt)
// Output : bigint

BigInt형의 숫자는 같은 BigInt형의 숫자값과는 아래와 같은 산술 연산이 가능하다.
( +, *, -, **, % )

const bigInt = 6145390195186705000n;
console.log(bigInt + 1n)
// Output : 6145390195186705001n

참고로 같은 맥락으로 단항연산자(+)도 불가하다.

테스트

function solution(n, words) {
  const sNum = "222222222222222222";

  if (sNum.length > 15) {
    console.log('bigint sNum',BigInt(sNum), BigInt(9))
    console.log(BigInt(sNum) % BigInt(9))
    console.log(Number(BigInt(sNum) % BigInt(9)) === 0 ? true : false)
  }

}

참고
Number.MAX_SAFE_INTEGER 자세히보기
BigInt형 자세히보기

profile
쉽게 터지지 않아요.

0개의 댓글