자바스크립트
Section 9. 자바스크립트 BigInt
포칼이
2023. 4. 6. 16:50
Number.MAX_SAFE_INTEGER 더 큰 정수를 다루기 위한 자료형이다.
매우 큰 정수를 다뤄야 하는 특수한 경우에 사용한다.
console.log(
Number.MAX_SAFE_INTEGER
); //9007199254740991
for (let i = 0; i < 100; i++) {
console.log(Number.MAX_SAFE_INTEGER + i);
}
출력문을 보면 다음과 같다
자바스크립트의 방식으로는 이 이상의 숫자를 표현하기가 매우 어렵다. 그래서 이런 정수들보다 더 큰 값을 다룰때는 아래의 방법들로 한다.
const bigInt1 = 9007199254740991n; // 끝에 n을 붙임
const bigInt2 = BigInt(9007199254740991);
const bigInt3 = BigInt('9007199254740991');
const bigInt4 = BigInt(0x1fffffffffffff) // 9007199254740991
console.log(typeof bigInt1); //bigint
bigint 자료형으로 큰 정수를 생성을 했고 (bigInt === bigInt2 === bigInt3 ===bigInt4 이다) 이것을 똑같이 for문으로 돌려보면 다음과 같다.
for (let i = 0; i < 100; i++) {
console.log(bigInt1 + BigInt(i));
}
잘 출력이 되는 것을 확인할 수 있다.
BigInt의 특징들
일반 number 타입과 산술 (+, -, *, /, %, **) 연산이 불가능하다.
console.log(
1n + 1
); 애러
console.log(
1n + 1n
); //2n
따라서 양쪽 모두 BigInt로 변환하여 계산하는 방법을 사용한다.
// 양쪽 모두 BigInt로 변환하여 계산하는 방법 사용
const calcAsBigInt = (x, y, op) => {
return op(BigInt(x), BigInt(y));
}
console.log(
calcAsBigInt(1n, 1, (x, y) => x + y)
); //2n
비교 연산은 가능하다.
console.log(
1n === 1, // 타입은 다름
1n == 1,
1n < 2,
1n >= 0,
2n < 1
); //false true true true false
number 숫자와 섞여 정렬이 가능하다.
console.log(
[4n, 7, 6n, 3, 1, 5, 9, 2n, 8n]
.sort((a, b) => a > b ? 1 : -1)
); //[1, 2n, 3, 4n, 5, 6n, 7, 8n, 9]
불리언으로 변환되는 연산이 가능하다.
console.log(
!!(0n),
!!(1n)
); //false, true
소수점 아래는 버린다.
console.log(
5n / 2n
); //2n
Math의 정적 메서드에서 사용이 불가능하다.
console.log(
Math.max(1n, 2n)
); //애러
number로 변환이 가능하지만... - 정확성 유실에 주의해야 한다.
console.log(
Number(1n),
Number(9007199254740993n)
); //1 9007199254740992
MAX_SAFE_INTEGER 보다 더 큰 값을 넣었더니 정확성이 유실되었다.