문제의 발단
부동소수점에 대해 복습하던 중, 웹 개발 주력 언어인 Javascript의 소수점 처리 방식이 궁금해졌다.
Typescript를 사용해본 독자들은 number 원시 타입에 익숙할 것이다.
그렇다면 number 타입은 어느 범위의 숫자를 지원할까?
Number
Javascript가 최대 및 최소로 표현할 수 있는 숫자는 MAX_VALUE, MIN_VALUE 속성으로 파악 가능하다.
console.log(Number.MAX_VALUE);
console.log(Number.MIN_VALUE);
즉, 해당 값을 넘어가면 오차가 발생하거나 infinity로 판단된다.
부동소수점에 대한 자세한 내용은 CS 파트에서 다루겠다.
그렇다면, 범위를 늘리려면 어떻게 해야할까? → `Bigint` 자료형을 사용해보자.
Bigint
BigInt 는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체이다.
BigInt는 정수 리터럴의 뒤에 `n`을 붙이거나(10n) 함수 `BigInt()`를 호출해 생성할 수 있다.
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n
속성
수학 연산자
BigInt는 대개 일반 숫자와 큰 차이 없이 사용할 수 있다.
console.log(1n + 2n); // 3
주의점
- 나눗셈 연산자에서는 소수부가 없다.
- `BigInt` 값과 일반 숫자를 섞어서 사용할 수 없다
→ 형 변환을 통해 자료형을 동일하게 설정해주어야 한다. - `+` 연산자를 사용하면, `Number` 범위 외 비트는 잘려나간다.
→ 따라서, `bigint`는 `+` 연산자를 지원하지 않는다.
// #1
console.log(5n / 2n); // 2
// #2.
console.log(1n + 2); // Error: Cannot mix BigInt and other types
// 형 변환
alert(1n + BigInt(2)); // 3
alert(Number(1n) + 2); // 3
// #3. + 연산자 사용 불가
alert( +2n ); // 에러
비교 연산자
- `>` `<` 모두 사요 가능하며, `Number`와 동일하게 작용한다.
- `Number` 자료형과 비교하는 경우, `==` 는 작동하나, `===` 는 false를 도출한다.
// #1. > <
console.log( 2n > 1n ); // true
console.log( 2n > 1 ); // true
// #2. == and ===
console.log( 1 == 1n ); // true
console.log( 1 === 1n ); // false
논리 연산자
`Number`와 동일하게 작동한다.
if (0n) {
// 실행 X
}
console.log( 1n || 2 ); // 1 (truthy)
console.log( 0n || 2 ); // 2 (falsy)
Typescript
version 3.2 부터 `bigint`를 사용가능하다.
const num: bigint = 10n;
const num2: bigint = Bigint(10);
결론
그렇다면 항상 Bigint를 사용하는 것이 좋을까?
Bigint는 Number에 비해 연산과정이 오래걸린다.
시간적 소요는 성능에 영향을 끼치므로, 꼭 필요한 경우에만 사용하도록 하자.
'웹 프로그래밍 > JavaScript' 카테고리의 다른 글
자바스크립트는 싱글 스레드 언어이다. (0) | 2024.05.27 |
---|---|
async, await + setTimeout 동시에 사용하기 (0) | 2024.04.30 |