[Javascript] BigInt
JS BigInt, JavaScript BigInt, 임의 정밀도 정수
정의
BigInt 는 임의 정밀도 정수. Number.MAX_SAFE_INTEGER (2^53 - 1) 를 넘어가는 정수를 정확히 표현. ES2020 도입.
const big = 12345678901234567890n; // 끝에 'n'
const fromCtor = BigInt('12345678901234567890');
typeof big // 'bigint'
왜 필요한가
9007199254740992 + 1 // 9007199254740992 ❌ (정확도 손실)
9007199254740992n + 1n // 9007199254740993n ✓
큰 ID, 암호화, 정밀 산술, 통화 (cent 기반 정수) 에 안전.
사용
const a = 10n;
const b = 20n;
a + b // 30n
a * b // 200n
a / b // 0n (정수 나눗셈)
a ** 3n // 1000n
a < b // true
a === b - 10n // true
함정: number 와 혼합 금지
1n + 1 // ❌ TypeError: Cannot mix BigInt and other types
1n + 1n // 2n
1n + BigInt(1) // 2n
Number(1n) + 1 // 2
같은 타입끼리만 산술 가능. 명시적 변환 필요.
비교는 가능
1n == 1 // true (== 는 변환 허용)
1n === 1 // false (=== 는 엄격)
1n < 2 // true (관계 연산자는 OK)
BigInt → Number
Number(123n) // 123
Number(12345678901234567890n) // 12345678901234568000 (정확도 손실!)
작은 BigInt 만 Number 변환 안전.
JSON 호환성
JSON.stringify({ id: 1n }) // ❌ TypeError
JSON.stringify({ id: '1' }) // 우회: string 으로
JSON 표준은 BigInt 미지원. 직렬화는 문자열로.
// BigInt → JSON (string)
JSON.stringify({ id: 1234n }, (k, v) =>
typeof v === 'bigint' ? v.toString() : v)
// '{"id":"1234"}'
// JSON → BigInt (reviver)
JSON.parse(text, (k, v) =>
k === 'id' ? BigInt(v) : v)
자주 쓰는 사례
1. 큰 ID 처리
const userId = BigInt('9223372036854775807'); // 64-bit max
DB 의 BIGINT 컬럼 (PostgreSQL bigserial 등) 매칭.
2. 정밀 계산
// 통화: cent 단위로 정수 처리
const balance = 100_00n; // $100.00 = 10000 cent
const transfer = 50_00n;
const remaining = balance - transfer;
3. 비트 연산 (큰 정수)
const flags = 0n;
const FLAG_ADMIN = 1n << 63n; // 64-bit 비트 위치
flags | FLAG_ADMIN
Math 함수와 호환 안 됨
Math.abs(-5n) // ❌ TypeError
// 직접 처리
const abs = (x) => x < 0n ? -x : x;
abs(-5n) // 5n
Math.* 함수는 BigInt 미지원.
Number vs BigInt 선택
| 시나리오 | 권장 |
|---|---|
| 일반 정수 (< 2^53) | Number |
| 큰 ID | BigInt 또는 string |
| 정밀 산술 (통화) | BigInt (정수 단위) |
| 부동소수점 | Number |
| 비트 연산 (64-bit+) | BigInt |
| JSON 인터페이스 | string |
함정
1. 리터럴 표기
1n // ✓
0o10n // ✓ (8진 BigInt)
0x10n // ✓ (16진)
1_000_000n // ✓ (separator)
1.5n // ❌ SyntaxError (BigInt 는 정수만)
2. Math.pow
2n ** 100n // BigInt 거듭제곱
Math.pow(2, 100) // 1.2676506002282294e+30 (Number, 정확도 손실)
3. Array, Set 의 키
new Set([1n, 1]) // {1n, 1} (다른 키로 취급)
💬 댓글