본문으로 건너뛰기
김신건의 로그

[Javascript] BigInt

· 수정 · 📖 약 1분 · 252자/단어 #javascript #primitive #bigint #number
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
큰 IDBigInt 또는 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}  (다른 키로 취급)

참고

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기