[모던 JavaScript 튜토리얼] 21. 숫자형

3 분 소요

본문 바로가기


자바스크립트에서 숫자를 표현하는 방법은 두 가지다.

  1. 64비트 형식의 일반적인 숫자.
  2. 64비트를 넘어가는 범위의 숫자는 BigInt라는 원시값을 통해 표현한다.


숫자를 입력하는 다양한 방법

let billion = 1000000000;

console.log(billion); // 10억 (1,000,000,000)

위 코드는 변수에 10억을 담아 출력하는 간단한 예제다. 위처럼 0을 9번 작성하다보면, 실수를 범할 수 있다.


let billion = 1e9;  // 10억, 1과 9개의 0

console.log(billion); // 10억 (1,000,000,000)
console.log(7.3e9);   // 73억 (7,300,000,000)

자바스크립트도 위와 같이 지수 표기법을 제공한다. 위처럼 작성하면 보다 명시적이다.


16진수, 2진수, 8진수

let hexa = 0xff;
let binary = 0b11;
let octal = 0o10;

console.log(hexa);   // 255
console.log(binary); // 3
console.log(octal);  // 8

16진수는 0x, 2진수는 0b, 8진수는 0o를 통해 표현할 수 있다.


toString(base)

let num = 255;

console.log( num.toString(16) );  // ff
console.log( num.toString(2) );   // 11111111

num.toString(base) 메서드는 base 진법으로 num 을 표현한 후, 이를 문자형으로 변환해 리턴한다.


// let num = 255;

console.log( 255..toString(16) );  // ff
console.log( 255..toString(2) );   // 11111111

숫자로 직접 메서드를 호출하고 싶으면 위와 같이 두 개의 점을 이용해 메서드를 접근해야 한다.


어림수 구하기

  • Math.floor : 소수점 첫째 자리에서 내림.
  • Math.ceil : 소수점 첫째 자리에서 올림.
  • Math.round : 소수점 첫째 자리에서 반올림.
  • Math.trunc : 소수부를 싹 버림. 정수로 변환되는 효과가 있다.


let num = 12.34;
let converted = num.toFixed(1);

console.log(converted);       // 12.3
console.log(typeof converted) // string

특정 소수점까지 남기고 싶을 땐 toFixed 메서드 를 사용한다. 파라미터로 전달된 수의 다음 자릿수에서 반올림하는 효과가 있다. 반환된 값이 문자열이라는 것을 주의하자. 결과를 단항 덧셈 연산자(+)나 Number() 를 이용해 숫자형으로 가공하자.


부정확한 계산

자바스크립트에서 숫자는 64비트로 표현된다. 이 중 52비트가 실질적인 숫자 표현에 사용되고, 11비트는 소수점 위치를, 1비트는 부호를 저장하는 데 사용된다.

console.log(1e500) // Infinity

64비트로 감당안되는 숫자는 Infinity 로 처리된다.


console.log(0.1 + 0.2 === 0.3); // false
console.log(0.1 + 0.2);         // 0.30000000000000004

위처럼 정밀도 손실(loss of precision)에 의해 예상과 다른 결과가 나오기도 한다. 숫자는 컴퓨터상에서 2진수로 표현되기 때문에, 0.1을 정확하게 저장하는 방법은 없다. 실수를 이진 부동소수점으로 처리하는 IEEE-754 규칙에 의해 발생한 오차라고 보면 될 것 같다.


isNaN, isFinite

console.log(isNaN("123")); // false
console.log(isNaN("str")); // true
console.log(isNaN(NaN));   // true
console.log(NaN === NaN);  // false

isNaN(value) 는 인수를 숫자로 변환한 뒤, 변환된 숫자가 NaN인 경우 true를 반환한다.

맨 아래 예시와 같이, NaN은 자기 자신을 포함해 그 어떤 값과도 같지 않다는 특수한 성질을 가지므로, NaN 판별은 반드시 isNaN 메서드 로 해야한다는 점을 주의하자.


console.log(isFinite("15"));     // true
console.log(isFinite("str"));    // false
console.log(isFinite(Infinity)); // false
console.log(isFinite(""));       // true

isFinite(value) 는 인수를 숫자로 변환한 뒤, 변환된 숫자가 NaN, Infinity, -Infinity 가 아닌 일반 숫자의 경우 true를 반환한다.

맨 아래 예시와 같이, 빈 문자열은 숫자와 관련된 모든 내장 함수에서 0으로 취급된다는 점을 주의하자.


Object.is

console.log(NaN === NaN);         // false
console.log(Object.is(NaN, NaN)); // true

console.log(0 === -0);            // true
console.log(Object.is(0, -0));    // false

Object.is 는 동등 연산자( === )처럼 값을 비교할 때 사용되는 특별한 내장 메서드다. 위의 두 경우를 제외한 모든 경우에서 Object.is 는 동등 연산자와 같은 결과를 보여준다.


parseInt, parseFloat

console.log(parseInt("100px"));    // 100
console.log(parseInt("12.3"));     // 12

console.log(parseFloat("12.5em")); // 12.5
console.log(parseFloat("12.3.4")); // 12.3

parseIntparseFloat문자열 맨 처음부터 숫자를 읽을 수 없을 때까지 읽어 그 값을 반환한다.


console.log(parseInt("0xff", 16));  // 255
console.log(parseInt("ff", 16));    // 255

console.log(parseInt("0b1010", 2)); // 0
console.log(parseInt("1010", 2));   // 2

parseInt 의 경우, 두 번째 파라미터로 진법 base 를 줄 수 있다. 해당 진수로 숫자를 변환해 리턴한다.

위 예시의 경우, 2진수 “0b1010” 을 파싱할 때에는 0을 읽고 다음 문자 b를 읽지 못해 에러를 발생시키고 0을 리턴하는 반면, 16진수 “0xff” 를 파싱할 때에는 0을 리턴하지 않는 예외적인 모습을 볼 수 있다. 16진수는 알파벳 표현이 가능하므로, 모든 알파벳을 읽어야 하기 때문이라고 생각한다..


기타 유용한 Math 메서드

  • Math.random() : 0과 1 사이의 난수를 반환한다.
  • Math.max(a, b, c …) / Math.min(a, b, c …) : 인수 중 최대 혹은 최소 값을 반환한다.
  • Math.pow(n, power) : n을 power 번 거듭제곱 한 결과 값을 반환한다.

댓글남기기