티스토리 뷰
목차
숫자
TypeScript에는 2종류의 내장된 숫자형이 있습니다. 대부분의 경우 타입스크립트 number를 사용합니다.
number
TypeScript(또는 그 아래에서 실행되는 JavaScript)는 64비트 부동 소수점을 취급합니다. 이는 어떤 CPU에서도 기본적으로 같은 정밀도(IEEE 754 규격)를 가집니다. 정수를 손실 없이 저장할 수 있는 것은 53비트(-1)까지므로, ±약 9007조까지의 정수를 다룰 수 있습니다. 그 이상의 숫자를 넣으면 뒷자리가 오차로 잘리는 등 타입스크립트에서 문제가 발생합니다.
타입스크립트에서 정확한 상한과 하한은 Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER라는 상수로 확인할 수 있습니다. 또한 Number.isSafeInteger(숫자)라는 함수를 사용해 유효한 숫자인지 확인할 수 있습니다.
The memory format of an IEEE 754 double floating point value. by Codekaizen (CC 4.0 BY-SA)
IEEE 754 규격으로 정해져 있습니다.
// 숫자 표시
console.log(10.5);
console.log(128);
console.log(0b11); // 0b에서 시작되는 2진수
console.log(0777); // 0, 0o에서 시작되는 8진수
console.log(0xf7); // 0x에서 시작되는 16진수
// 변수에 대입. 자료형은 number
const year: number = 2019;
// 다른 데이터형으로 변환
console.log(year.toString()); // '2019'
console.log(year.toString(2)); // toString의 인수로 2진수 설정
console.log(Boolean(year)); // 0 이외는 true
// 다른 데이터형을 수치로 변환
console.log(parseInt("010")); // →10 문자열은 parseInt에서 10진수/16진수로 변환
console.log(parseInt("010", 8)); // →8 2번째 인자
console.log(Number(true)); // boolean 자료형은 Number 함수에서 0, 1로 변환
변환 방법에 따라 결과가 달라집니다.
문자열에서 숫자 변환
|
Number (문자열) |
parseInt (문자열) |
parseInt (문자열, radix) |
리터럴 |
"10" |
10 |
10 |
radix 변경 |
10 |
"010" |
10 |
10 |
radix 변경 |
8 (8진수) |
"0x10" |
16 |
16 |
radix 16 이외는 0 |
8 (8진수) |
"0o10" |
8 |
0 |
0 |
8 (8진수) |
"0b10" |
2 |
0 |
0 |
2 (8진수) |
또한, 타입스크립트 리터럴 8진수는 ESLint 설정 중 no-octal 옵션과 관련이 있습니다.
IE8 이전 시대의 브라우저는 parseInt()에 0을 첫 인자로 전달하면 8진수로 변환되었습니다. 그래서 radix를 생략하지 않고 꼭 10을 전달해야 했습니다. 하지만 그 시대의 브라우저는 현재 시장에 없어요. 10은 생략해도 문제없습니다.
수치형 구분 (용도에 맞게 사용하기)
TypeScript엔 2종류의 내장된 숫자 타입이 있습니다. 두 형식을 섞어 계산할 수 없습니다.
- number : 64비트 부동 소수점
- bigint : 자릿수 제한 없는 정수(10n처럼 뒤에 n를 붙임)
number 형식은 빈번하게 사용합니다. 특히 부동소수점을 사용한다면 이것밖에 못 씁니다. 그 외에 ±2^53-1까지는 정수로 표현되므로 정보가 잘리거나 하지 않습니다. 또한 이 범위 값의 연산이 가장 빠릅니다.
bigint 형식은 정수밖에 표현할 수 없지만, 자릿수 제한은 없습니다. 다만, 타입스크립트에선 "target": "esnext"를 설정하지 않으면 쓸 수 없습니다. (추후 변경 여지 있음)
number는 2진수로 표현한 수치이므로 0.2 + 0.1 등 깔끔하게 2진수로 표현할 수 없는 수치라면 오차가 발생합니다. 금액 계산 등 다소 느려도 정확한 계산이 필요한 경우 decimal.js 등의 외부 라이브러리(https://www.npmjs.com/package/decimal.js)를 사용합니다.
TypeScript number 오차
const a = 0.1;
const b = 0.2;
console.log(a + b);
// 0.30000000000000004
미완성 글입니다 ...