
한가롭게 알고리즘 문제를 풀던중, 이상한 현상을 발견했다.
숫자로 이루어진 문자열을 Number()로 형변환을 했더니, 문자열의 숫자와, 형변환된 정수값이 달랐다.
const numStr = '6145390195186705543';
console.log('숫자로 이루어진 문자열 : ', numStr);
// Output : '6145390195186705543'
console.log('위 문자열을 Number()를 사용하여 형변환 : ', Number(numStr));
// Output : 6145390195186705000

javascript의 Number()는 안전한 최대의 정수값(2^53 - 1)까지만 형변환이 가능하다.
console.log(Number.MAX_SAFE_INTEGER);
// Output: 9007199254740991
따라서 아래의 경우 integer형 값의 최대 한도까지만 형변환이 되었고, 그 뒤의 값들은 0으로 처리되었던 것이다.
9007199254740991
6145390195186705000
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] 이다.
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)
}
}