숫자형 Number

김수정·2020년 4월 13일
0

숫자형의 종류

  • 정수: 0, 1, 2, 3, 4,...
  • 소수: 0.24, 1.44 ...
  • Infinity: 어떤 숫자보다 큰 특수 값. 무한대. 어떤 숫자는 0으로 나누면 무한대.
  • -Infinity: 음수 무한대
  • NaN: 숫자가 아니라는 뜻으로 에러가 발생했다는 뜻입니다.

숫자 표시방법

지수표기법

e를 활용하여 수를 표시합니다. 보통 0이 많이 들어가는 큰 숫자나 아주 작은 숫자 표시할 때 사용합니다.

let billion = 1e9;  // 10억, 1과 9개의 0
alert( 7.3e9 );  // 73억 (7,300,000,000)

let ms = 1e-6; // 1에서 왼쪽으로 6번 소수점 이동

num.toExponential() 지수표기법으로 바꾼 문자열을 반환합니다.

(1203).toExponential() // "1.203e+3"

진수

자바스크립트에서 기본적으로 지원하는 진법은 3개입니다.
이 외의 진법은 parseInt(최대 36진법)를 사용합니다.

alert( 0xff ); // 16진수
alert( 0b11111111 ); // 2진수
alert( 0o377 ); // 8진수

위의 코드를 실행해보면, 모두 255라는 값이 나옵니다. 우리가 몇진법으로 표현하든, 리턴되는 값은 10진법의 숫자인 셈이죠.
그런데 우리가 코딩할 때, 해당 진법의 값을 그대로 문자열 값으로 받고 싶다면? toString(base)를 사용할 수 있습니다.
toString은 base진법(최대 36진법)으로 숫자를 표현한 뒤, 이를 문자형으로 반환합니다.

메소드설명
Number.parseInt(num, base)num을 base진법으로 변환하여 숫자값 반환
num.toString(base)num을 base진법으로 변환하여 문자값 반환
let num = 255;

alert( num.toString(16) );  // ff
alert( num.toString(2) );   // 11111111
255..toString(16) // ff
(244).toString(16) // ff

어림수 구하기

  1. 내림(버림)
Math.floor(3.1); // 3
Math.floor(-1.1); // -2
  1. 올림
Math.ceil(3.1); // 4
Math.ceil(-1.1); // -1
  1. 반올림
Math.round(3.1); // 3
Math.round(-1.1); // -1
  1. 소수점 무시 (Not supported IE)
Math.trunc(3.1); // 3
Math.trunc(-1.1); // -1

그런데 이들은 소수점 첫째자리까지만 반응합니다. n번째 자리까지 표현하고 싶다면 toFixed(n)을 사용합니다.

num.toFixed(digits) digits+1 자리에서 반올림 한 값을 문자열 로 반환합니다. == num.toPrecision(digits)

let num = 12.34;
alert( +num.toFixed(1) ); // 12.3

아래 헬퍼함수를 활용하여 버림용, 올림용도 만들어 사용하면 됩니다.

let num = 1.234567;

const floorByNthDigits = (value, digits) => {
  if (typeof digits !== "number" || digits < 0) {
    return new Error("소수점 자릿수는 양의 정수가 와야 합니다.");
  }
  
  const _digits = Number("1e" + digits);
  
  return Math.floor(value * _digits) / _digits;
};

console.log(floorByNthDigits(num, 2));

계산의 부정확성(정밀도 손실)

64비트가 넘어가는 큰 숫자이거나, 소수와 소수연산 등은 계산이 정확하지 않습니다.
2진법 체계인 컴퓨터가 십진법의 나눗셈을 하려니 무한소수가 발생하기 때문입니다.

정밀도 손실 보안 방안.
(1) num.toFixed(digits)을 사용하여 원하는 계산식까지만 자릿수를 잘라줍니다. == num.toPrecision(digits)
(2) 정수로 만들어 계산하고 다시 나눠줍니다. (제일 정확)

let sum = 0.1 + 0.2;
alert( +sum.toFixed(2) ); // (1)
((0.1 * 10) + (0.2 * 10)) / 10 // (2)
Number((0.1 + 0.2).toPrecision(12)) // (3)

특수 숫자형

숫자인지 아닌지 확인하기

Number.isNaN
인수를 숫자로 변환한 다음 숫자가 아닌지 테스트. 숫자가 아니어야 true.

alert( Number.isNaN(NaN) ); // true
alert( Number.isNaN("str") ); // true

Number.isFinite
인수를 숫자로 변환하고 NaN/Infinity/-Infinity가 아닌 일반 숫자면 true.
문자열이 일반 숫자인지 검증하는데 주로 사용합니다.

주의
isFinite(num)은 자동 숫자형변환 후 검사하고
Number.isFinite(num)은 자동형변환을 하지 않고 검사합니다.

alert( Number.isFinite("15") ); // false
alert( Number.isFinite("str") ); // false, NaN이기 때문입니다.
alert( isFinite(" ") ); // true

Number.isInteger
정수인지 확인

alert( Number.isInteger("15") ); // false
alert( Number.isInteger(15) ); // true

Number.isSafeInteger
안전한 정수(64비트를 넘지 않는 숫자)인지 확인

Numer.isSafeInteger(15) // true 

Object.is
'==='보다 더 신뢰할 만한 결과를 아래 두 가지 경우에서 보여줍니다.
1. Object.is(NaN, NaN) // true
2. Object.is(0, -0) // fasle

숫자만 추출하기

문자열에서 숫자를 읽다가 숫자가 아닌 문자를 만나 오류가 발생하면 이미 수집된 숫자를 반환해 줍니다.
parseInt의 두번째 매개변수인 radis는 진수를 지정합니다. 기본 10진수이며 10진법 사용 시 생략 가능합니다.

메소드설명
Number.parseInt(num, base)숫자값만 추출하여 정수로 반환
Number.parseFloat(num)숫자값만 추출하여 소수로 반환
alert( parseInt('100px') ); // 100
alert( parseFloat('12.5em') ); // 12.5
alert( parseInt('a123') ); // NaN, a는 숫자가 아니므로 숫자를 읽는 게 중지됩니다.

수학관련 객체 Math

난수 생성

Math.random()
0과 1사이의 난수를 반환합니다.

alert( Math.random() ); // 0.1234567894322
alert( Math.random() * 5 ); // 0.5435252343232

최대값, 최소값

Math.max(a, b, c...)
Math.min(a, b, c...)

alert( Math.max(3, 5, -10, 0, 1) ); // 5
alert( Math.min(1, 2) ); // 1

거듭제곱

Math.pow(n, power)
n을 power번 거듭제곱한 값을 반환합니다.

alert( Math.pow(2, 10) ); // 2의 10제곱 = 1024

절대값

console.log(Math.abs(-10)); // 10
console.log(Math.abs(10)); // 10

제곱근

console.log(Math.sqrt(25)); // 5
console.log(Math.sqrt(49)); // 7

숫자형변환

Number("6");
+"6";
profile
정리하는 개발자

0개의 댓글