본문 바로가기
C++ 200제/코딩 IT 정보

TypeScript 강좌 10. Primitive 수치형 number 정수

by vicddory 2020. 1. 25.


숫자

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)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



미완성 글입니다 ...

댓글