들어가며
자바스크립트에는 숫자를 다루는 데이터 타입인 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
'Javascript' 카테고리의 다른 글
[JS] 일치 연산자 '==='에 대해 알아보자 (1) | 2024.11.18 |
---|---|
[JS] 동등 연산자 '=='에 대해 알아보자 (0) | 2024.11.17 |
[JS] Call stack (1) | 2024.11.15 |
[JS] iterable? 그게 뭐죠? (1) | 2024.11.13 |
[JS] Object와 Map, 무엇을 선택해야 할까? (0) | 2024.11.11 |