숫자형 자료는 더 단순하고 가독성 좋게 표현하는 방법이 존재합니다.
아주 큰 수, 혹은 아주 작은 수를 입력할 때 e 를 사용하면 10의 거듭제곱을 편하게 표현할 수 있습니다.
let billion = 1e9; // 10억, 1과 9개의 0
let ms = 1e-6; // 1에서 왼쪽으로 6번 소수점 이동
alert( 7.3e9 ); // 73억 (7,300,000,000)
다음과 같이 나타냅니다.
// 16진수
alert( 0xff ); // 255
let a = 0b11111111; // 255의 2진수
let b = 0o377; // 255의 8진수
alert( a == b ); // true, 진법은 다르지만, a와 b는 같은 수임
base 에 들어간 숫자의 진법으로 num 을 표현하여, 문자형으로 변환 후 반환합니다.
let num = 255;
alert( num.toString(16) ); // ff
alert( num.toString(2) ); // 11111111
// 변수가 아닌 값으로 메서드 호출시 . 을 두 개 붙여야 에러 ❌
alert( 123456..toString(36) ); // 2n9c
num 을 소수점 n 번째 자리로 올림, 혹은 버림 후 문자형으로 반환합니다.
let num = 12.36;
alert( num.toFixed(1) ); // "12.4"
숫자는 64비트 형식 IEEE-754 로 표현됩니다.
64비트 중 52비트는 숫자를 저장하는 데 사용되고, 11비트는 소수점 위치를(정수는 0), 1비트는 부호를 저장하는 데 사용됩니다.
숫자를 표현하는데 정확히 64비트를 사용해야 합니다.
그런데, 숫자가 너무 커지면 64비트만으로는 부족하여 Infinity 로 처리됩니다.
또, 소수 계산에서 문제가 발생할 수 있습니다.
alert( 0.1 + 0.2 == 0.3 ); // false
alert( 0.1 + 0.2 ); // 0.30000000000000004
이는 내부적으로 숫자를 이진수 로 저장하고 있기 때문입니다.
이진수로는 1/10 을 정확히 표현할 수 없어 가장 가까운 값으로 반올림하여 표현합니다.
toFixed(n) 메서드를 사용하여 어림수를 만드는 방법으로 해결할 수 있습니다.
let sum = 0.1 + 0.2;
alert( sum.toFixed(2) ); // 0.30
alert( +sum.toFixed(2) ); // 0.3
값은 문자형으로 반환되지만, 단항연산자를 사용하면 숫자형으로 변환이 가능합니다.
내장 객체 Math 를 이용하여 다양한 메서드를 사용할 수 있습니다.
Math.floor : 소수점 첫째 자리에서 내림Math.ceil : 소수점 첫째 자리에서 올림Math.round : 소수점 첫째 자리에서 반올림내장 객체 Math 에서 수학 관련 함수와 상수를 제공합니다.
Math.random() : 0과 1 사이의 난수를 반환Math.max(a, b, c...) / Math.min(a, b, c...) : 인수 중 최대/최솟값을 반환Math.pow(n, power) : n을 power번 거듭제곱한 값을 반환100px 처럼 단위가 붙은 문자열에서 숫자만 추출하고 싶을 때 사용합니다.
문자를 만나기 전까지의 숫자를 떼와서 숫자형으로 반환합니다.
alert( parseInt('100px') ); // 100
alert( parseFloat('12.5em') ); // 12.5
alert( parseInt('a123') ); // NaN, 읽을 수 있는 숫자가 없으므로
NaN 과 Infinity 는 숫자형에 속하지만 서로 연산이 가능한 정상 숫자는 아닙니다. 따라서 정상적인 숫자와 구별하기 위해 isNaN 과 isFinite 함수를 사용합니다.
isNaN(value) : 인수를 숫자로 변환 후, NaN 이면 true 반환NaN 은 자기 자신을 포함하여 그 어떤 값과도 같지 않으므로 동등 비교 연산만으로는 불충분! 함수가 필요함isFinite(value) : 인수를 숫자로 변환 후, 변환한 숫자가 정상 숫자인 경우 true 반환