All Articles

wecode 11주차_2일 TIL_JS에서 Number의 값 중 infinity와 NaN에 대해 알아보자

image.png

Number

자바스크립트에서 Number란 64bit floating point로 이루어진 숫자형 데이터이다.
정수, 소수 다 Number가 되지만 infinity나 NaN 또한 Number이다!
infinity와 NaN에 대해서 더 알아보자!

NaN

말 그대로 Not a Number. 숫자가 아니라는 뜻!! 위코드 예시 문제에서 NaN을 리턴하라는 문제가 있어서 도전도전

function returnNaN() {
  return 3/'가';
}

문제의 예시 해답은 이렇게 주어졌지만 나는 꼼수를 써서

function returnNaN() {
  return NaN;
}

그냥 NaN이 리턴되게 했다 ㅋㅋㅋㅋㅋㅋ
가끔 개발자의 실수로 웹페이지에서 금액 대신 NaN이 뜨는 에러를 볼 수 있다.

image.png

이렇게 ㅋㅋㅋㅋㅋㅋㅋ
아니 계산을 어떻게 하라는건가욧ㅋㅋ 여튼.. MDN 문서의 내용을 덧붙이자면..!

NaN === NaN;        // false
isNaN(NaN);         // true

NaN과 NaN은 같을 수 없고.. isNaN으로 NaN인지 여부를 확인가능쓰 NaN과 숫자의 연산을 해보면 어떨까? a는 양의 정수이고, b는 NaN이다.

image.png

음의 정수로 시도해봐도 똑같다.
무조건 NaN과의 연산을 통해 NaN이 나오게 된다!

이제 infinity로 넘어가자!
내꺼하자 ha~ 의 인피니티 말고 무한대 인피니티!

Infinity

아까 NaN에서도 생략했지만, NaN과 Infinity는 전역객체의 속성이다.
그 말은 즉슨, 우리가 window에 이미 저장되어있는 값이기 때문에 console.log를 찍었을때 그 값이 바로 나온다는 사실!

또한.. NaN과는 조금 다르게 Infinity를 이용해 NaN보단 약간 더 다양한 연산이 가능하다는 사실..!

image.png

Infinity * 양의정수 === Infinity
Infinity / 양의정수 === Infinity
양의정수 / Infinity === 0
Infinity * 음의정수 === -Infinity
Infinity / 음의정수 === -Infinity
음의정수 / Infinity === -0

-0은… 뭔지 모르겠다.. 수학전공인 울 언니한테 물어봐야겠다!ㅋㅋㅋㅋ

여튼.. 위코드에서 준 문제는 더치페이 문제!

function dutch(count, price) {
  const dutchMoney = price/count;
  if (Number.isInteger(dutchMoney)) {
    return dutchMoney
  }
  else if (dutchMoney+1 === Infinity) {
    return 0
  }
  else {
    return +dutchMoney.toFixed(2)
  }
}

나는 이 문제를 정수인지, infinity인지, 소수인지로 나눠서 생각해보았다!
소수일 경우 소수 셋째자리에서 반올림을 해서 자릿수를 두개로 맞춰야하는데..
찾아보니 toFixed()라는 함수가 있는것!

toFixed()

  • 숫자를 괄호안의 수 만큼의 자릿수를 갖는 숫자로 변형
  • 괄호안에 숫자가 안들어가면 디폴트값이 0
  • 소수점이 길면 반올림하고, 짧으면 0으로 채운다

위의 코드에서 +dutchMoney라고 해준 이유는 Number(dutchMoney) 대신 뒤에 남는 0을 지워주기 위함ㅋㅋ 근데 모델솔루션을 보고 또 깜놀…

모델솔루션의 해답..

function dutch(count, price) {
  let result = price/count;

  if (!isFinite(result)) return 0;

  return Number((price/count).toFixed(2));
}

isFinite로 일단 무한대인지 판별을 하고.. 소수인지 정수인지 판별할 필요없이 숫자의 뒤에는 toFixed, 앞에는 Number로 쓰면 소수일땐 소수점 두 자리만 남기고, 정수일땐 알아서 정수로 변형시켜 줄 수있다.

간단한 문제였는데 한번도 깊이 생각해보지 못했던 Infinity와 NaN에 대해 생각해보고 좋았다!