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이 뜨는 에러를 볼 수 있다.
이렇게 ㅋㅋㅋㅋㅋㅋㅋ
아니 계산을 어떻게 하라는건가욧ㅋㅋ
여튼.. MDN 문서의 내용을 덧붙이자면..!
NaN === NaN; // false
isNaN(NaN); // true
NaN과 NaN은 같을 수 없고.. isNaN으로 NaN인지 여부를 확인가능쓰 NaN과 숫자의 연산을 해보면 어떨까? a는 양의 정수이고, b는 NaN이다.
음의 정수로 시도해봐도 똑같다.
무조건 NaN과의 연산을 통해 NaN이 나오게 된다!
이제 infinity로 넘어가자!
내꺼하자 ha~ 의 인피니티 말고 무한대 인피니티!
Infinity
아까 NaN에서도 생략했지만, NaN과 Infinity는 전역객체의 속성이다.
그 말은 즉슨, 우리가 window에 이미 저장되어있는 값이기 때문에 console.log를 찍었을때 그 값이 바로 나온다는 사실!
또한.. NaN과는 조금 다르게 Infinity를 이용해 NaN보단 약간 더 다양한 연산이 가능하다는 사실..!
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에 대해 생각해보고 좋았다!