Javascript

[JS] Number

Yepchani 2024. 11. 20. 17:15
반응형

들어가며

자바스크립트에는 숫자를 다루는 데이터 타입인 Numbert가 있습니다. 이번 시간에는 Number 타입에 대해서 알아보도록 하겠습니다.

 

Number

일반적으로 사용되는 숫자 데이터 타입입니다. 64비트 부동 소수점 형식을 사용해 정수와 소수를 모두 표현할 수 있습니다.

자바스크립트의 숫자는 255 또는 3.14와 같은 리터럴 형태로 표현됩니다. 255와 같은 숫자 리터럴은 정수가 아닌 부동 소수점 값입니다.

255 === 255.0; // true
255 === 0xff; // true (16진법)
255 === 0b11111111; // true (이진법)
255 === 0.255e3; // true (십진수 지수 표기법)

Number() 함수를 이용해 Number 타입이 아닌 값을 Number 타입으로 변환할 수 있습니다. 변환할 수 없다면 NaN을 반환합니다.

Number("123"); // 123
Number("invalid") // NaN

 

인코딩

Number 타입은 IEEE 754 표준에 따른 이중 정밀 64비트 이진 형식의 값입니다. 정수와 소수를 표현할 수는 있지만, 숫자의 크기와 정밀도에 한계가 있습니다.

IEEE 754 이중 정밀도 숫자는 세 부분으로 구성됩니다.

  • 1비트 - 부호 (양수 또는 음수)
  • 11비트 - 지수 (-1022 부터 1023까지)
  • 52비트 - 가수 (0에서 1사이의 숫자를 나타냄)

-2^53 + 1에서 2^53 - 1까지의 정수를 안전하게 표현할 수 있습니다. 이 범위를 초과하는 수는 정밀도 손실이 발생할 수 있습니다.

 

주요 상수

  • Number.MAX_VALUE: 표현할 수 있는 최대 숫자
  • Number.MIN_VALUE: 표현할 수 있는 최소 숫자
  • Number.MAX_SAFE_INTEGER: 정밀도 손실 없이 나타낼 수 있는 최대 정수
  • Number.MIN_SAFE_INTEGER: 정밀도 손실 없이 나타낼 수 있는 최소 정수
  • Number.POSITIVE_INFINITY: 양의 무한대
  • Number.NEGATIVE_INFINITY: 음의 무한대
  • Number.NaN: 숫자가 아님을 나타냄

 

Number 강제 변환

숫자를 인자로 기대하는 많은 내장 연산들은 숫자가 아닌 값이 들어왔을 때, 대략 다음과 같이 암묵적으로 변환 처리를 합니다.

  • 숫자는 그대로 반환됩니다.
  • undefined는 NaN으로 변환됩니다.
  • null은 0으로 변환됩니다.
  • true는 1로, false는 0으로 변환됩니다.
  • 문자열(String)은 숫자 리터럴을 포함하는 것처럼 구문 분석해 변환합니다. 실패시 NaN이 됩니다.
  • BigInt는 TypeError를 발생시킵니다.
  • 심볼(Symbol)은 TypeError를 발생시킵니다.
  • 객체(Object)는 처음에 원시값으로 변환되고, 이후 원시값이 숫자로 변환됩니다.

 

자바스크립트에는 비슷한 효과를 얻을 수 있는 두 가지 방법이 있습니다.

  • Unary plus
    값 앞에 +를 붙이면 위에 설명한 단계를 그대로 실행합니다.
  • Number()
    동일한 알고리즘을 사용하지만, BigInt를 변환하는 경우에 TypeError를 발생시키지 않고, 정밀도가 떨어진 숫자 값을 반환합니다.

 

정적 메서드

  • Number.isFinite()
    주어진 값이 유한한 숫자인지 확인합니다.
    console.log(Number.isFinite(10)); // true
    console.log(Number.isFinite(Infinity)); // false
  • Number.isInteger()
    주어진 값이 정수인지 확인합니다.
    console.log(Number.isInteger(4)); // true
    console.log(Number.isInteger(4.5)); // false
  • Number.isNaN()
    주어진 값이 NaN인지 확인합니다.
    console.log(Number.isNaN(NaN)); // true
    console.log(Number.isNaN("NaN")); // false
  • Number.parseFloat(string)
    문자열을 부동 소수점 숫자로 변환합니다.
    console.log(Number.parseFloat("3.14")); // 3.14
  • Number.parseInt(string, radix)
    문자열을 정수로 변환합니다. radix를 지정하면 해당 진수로 변환합니다.
    console.log(Number.parseInt("10")); // 10
    console.log(Number.parseInt("10", 2)); // 2

 

인스턴스 메서드

  • Number.prototype.toString(radix)
    숫자를 문자열로 변환합니다. radix를 지정하면 해당 진수로 변환합니다.
    const num = (255).toString(16); // "ff"
  • Number.prototype.toFixed(digits)
    소수점 이하의 자릿수를 지정하여 숫자를 문자열로 변환합니다.
    const num = (2.34567).toFixed(2); // "2.35"
  • Number.prototype.toExponential()
    지수 표기법으로 숫자를 문자열로 변환합니다.
    const num = (123456).toExponential(2); // "1.23e+5"
  • Number.prototype.toPrecision(precision)
    숫자를 지정한 자릿수로 표현한 문자열을 반환합니다.
    const num = (0.123456).toPrecision(3); // "0.123"

 

마치며

Number는 자바스크립트에서 숫자를 다루는 데이터 타입입니다. 다만 일정 범위를 넘어서면 정밀도 손실이 발생할 수 있으니 주의가 필요합니다.

피드백이나 의견은 언제나 환영합니다 :D

감사합니다.

 

References

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt