TypeScript Deep Dive
  • README
  • 시작하기
    • 왜 타입스크립트인가
  • 자바스크립트
    • 비교 연산자
    • 참조 연산자
    • Null vs. Undefined
    • this
    • 클로저
    • Number
    • Truthy
  • 미래의 자바스크립트
    • 클래스
      • 즉시실행함수
    • 화살표 함수
    • 나머지 연산자
    • let
    • const
    • 비구조화 할당
    • 전개 연산자
    • for...of
    • 이터레이터
    • 템플릿 리터럴
    • 프로미스
    • 제네레이터
    • Async Await
  • 프로젝트
    • 컴파일러 제어
      • tsconfig.json
      • 파일 경로 지정
    • 선언
    • 모듈화
      • 파일을 이용한 모듈화
      • globals.d.ts
    • 네임스페이스
    • 동적 표현식 가져오기
  • Node.js 시작하기
  • Browser 시작하기
  • 타입스크립트 타입 시스템
    • 자바스크립트 마이그레이션 가이드
    • @types
    • 주변 선언
      • 파일 선언
      • 변수
    • 인터페이스
    • 열거형(Enums)
    • lib.d.ts
    • 함수
    • 콜러블(Callable)
    • 타입 표명(Type Assertion)
    • 신선도(Freshness)
    • 타입 가드
    • 리터럴(Literal)
    • 읽기 전용(readonly)
    • 제네릭
    • 타입 인터페이스
    • 타입 호환성
    • Never 타입
    • 구별된 유니온
    • 인덱스 서명(Index Signature)
    • 타입 이동하기
    • 예외 처리
    • 믹스인(Mixin)
  • JSX
    • React
    • Non React JSX
  • Options
    • noImplicitAny
    • strictNullChecks
  • 타입스크립트 에러
    • 에러 메세지
    • 공통 에러
  • NPM
  • 테스트
    • Jest
    • Cypress
  • Tools
    • Prettier
    • Husky
    • ESLint
    • Changelog
  • 팁
    • 문자열 Enums
    • 타입 단언
    • 상태 저장 함수
    • 커링
    • 제네릭 타입 예시
    • 객체 타입 설정
    • 유용한 클래스
    • Import / Export
    • 속성 Setters
    • outFile 주의사항
    • 제이쿼리 팁
    • 정적 생성자
    • 싱글톤 패턴
    • 함수 파라미터
    • 토글 생성
    • Import 여러개 하기
    • 배열 생성
    • 생성자에서 타입정의
  • 스타일 가이드
  • 타입스크립트 컴파일러 구조
    • Program
    • AST
      • TIP: Visit Children
      • TIP: SyntaxKind enum
      • Trivia
    • Scanner
    • Parser
      • Parser Functions
    • Binder
      • Binder Functions
      • Binder Declarations
      • Binder Container
      • Binder SymbolTable
      • Binder Error Reporting
    • Checker
      • Checker Diagnostics
      • Checker Error Reporting
    • Emitter
      • Emitter Functions
      • Emitter SourceMaps
    • Contributing
Powered by GitBook
On this page
  • Core Type
  • Decimal
  • Integer
  • big.js
  • NaN
  • Infinity
  • Infinitesimal

Was this helpful?

  1. 자바스크립트

Number

어떤 프로그래밍 언어로도 숫자를 처리할 때 언어별 차이점을 알아야 합니다. 다음은 자바스크립트 숫자에 대한 몇가지 중요한 정보입니다.

Core Type

자바스크립트는 오직 한가지 숫자타입만 가집니다. 이것은 이중 정밀도 64비트 숫자입니다. 아래에서는 권장 솔루션과 함께 한계에 대해서 논의합니다.

Decimal

2가지이상의 숫자타입에 익숙한 사람들을 위해 / 당신은 이진 부동 소수점 숫자가 10진수에 정확히 매핑되지 않는다는 것을 알 것입니다. 그리고 유명한 예가 나와 있습니다.

console.log(0.1 + 0.2) // 0.30000000000000004

10진수는 아래에 언급한 big.js을 사용하십시요.

Integer

number타입으로 작성된 정수한계는 다음과 같습니다.

console.log({ max: Number.MAX_SAFE_INTEGER, min: Number.MIN_SAFE_INTEGER })
// {max: 9007199254740991, min: -9007199254740991}

안전한 정수를 사용할 때 반올림한 값은 사용할 수 없습니다.

안전하지 않은 값은 안전한 값에서 +1 / -1 떨어져 있으며 이러한 값을 추가할 경우 반올림된 결과값을 확인할 수 있습니다.

console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2) // true!
console.log(Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2) // true!

console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1) // 9007199254740992 - Correct
console.log(Number.MAX_SAFE_INTEGER + 2) // 9007199254740992 - Rounded!
console.log(Number.MAX_SAFE_INTEGER + 3) // 9007199254740994 - Rounded - correct by luck
console.log(Number.MAX_SAFE_INTEGER + 4) // 9007199254740996 - Rounded!

ES6에서 Number.isSafeInteger을 이용해서 정수 체크를 안전하게 할 수 있습니다.

// Safe value
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER)) // true

// Unsafe value
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1)) // false

// Because it might have been rounded to it due to overflow
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 10)) // false

big.js

  • 완벽한 10진수 수학

  • 경계를 벗어난 정수값을 안전하게 사용할 수 있습니다.

간단한 설치

npm install big.js @types/big.js

간단한 예제

import { Big } from 'big.js'

export const foo = new Big('111.11111111111111111111')
export const bar = foo.plus(new Big('0.00000000000000000001'))

// To get a number:
const x: number = Number(bar.toString()) // Loses the precision

UI / 차트, 캔버스, 도면등 성능이 중요한 경우에는 이 라이브러리를 사용하지 마십시오.

NaN

일부 숫자 계산이 number값으로 반환될 수 없는 경우 자바스크립트는 NaN값을 반환합니다.

console.log(Math.sqrt(-1)) // NaN

메모: 일치연산자는 NaN값에서는 작동하지 않습니다. Number.isNaN을 이용해서 확인하십시오.

// Don't do this
console.log(NaN === NaN) // false!!

// Do this
console.log(Number.isNaN(NaN)) // true

Infinity

숫자로 표현할 수 있는 값의 외부 범위는 Number.MAX_VALUE그리고 -Number.MAX_VALUE값으로 사용할 수 있습니다.

console.log(Number.MAX_VALUE) // 1.7976931348623157e+308
console.log(-Number.MAX_VALUE) // -1.7976931348623157e+308

범위 밖의 값은 이러한 제한값에 고정됩니다.

console.log(Number.MAX_VALUE + 1 == Number.MAX_VALUE) // true!
console.log(-Number.MAX_VALUE - 1 == -Number.MAX_VALUE) // true!

범위를 벗어나는 값은 Infinity/-Infinity와 같은 특수한 값을 이용하십시요.

console.log(Number.MAX_VALUE + 10 ** 1000) // Infinity
console.log(-Number.MAX_VALUE - 10 ** 1000) // -Infinity

물론 이런 특수한 무한대 값은 연산을 통해서 확인할 수 있습니다.

console.log(1 / 0) // Infinity
console.log(-1 / 0) // -Infinity

당신은 Infinity값을 수동으로 사용하거나 아래와 같이 Number클래스의 정적 구성요소로 사용할 수 있습니다.

console.log(Number.POSITIVE_INFINITY === Infinity) // true
console.log(Number.NEGATIVE_INFINITY === -Infinity) // true

다행히도 비교연산자 (< / >)는 무한대 값에 대해서 안정적으로 동작합니다.

console.log(Infinity > 1) // true
console.log(-Infinity < -1) // true

Infinitesimal

숫자로 사용할 수 있는 0이 아닌 가장 작은 값은 Number.MIN_VALUE을 이용해서 정적숫자로 사용할 수 있습니다.

console.log(Number.MIN_VALUE) // 5e-324

MIN_VALUE보다 작은 값은 0으로 고정됩니다.

console.log(Number.MIN_VALUE / 10) // 0

복습: Number.MAX_VALUE를 무한대의 값에 고정하십시요. Number.MIN_VALUE를 이용하면 가장 작은 값을 구할 수가 있고 그 보다 작은 값은 0으로 고정하십시요.

Previous클로저NextTruthy

Last updated 6 years ago

Was this helpful?

자바스크립트는 결국 지원을 받게 될 것이다. 지금으로서는 정밀한 정수를 사용해야 한다면 아래 언급된 big.js를 사용하십시오.

재무, 계산등에 수학을 사용할때마다 와 같은 라이브러리를 사용하십시오.

BigInt
big.js