수(Number) 사용시 유의해야할 부분
2비트는, 0과 1로 이루어질 수 있는 2진수의 메모리를 말한다. 바이트란 이 2진수의 비트가 8개 모여있을 것을 말한다.
바이트가 한번에 표현할 수 있고 담을 수 있는 메모리는 곧 2^8개를 의미한다.
자바스크립트에서 표현하는 수의 메모리는 “이중정밀도 64비트 IEEE 754값”이다. 자바스크립트에서 수를 표현할 때 주의해아하는 부분이 있는데, 첫째는 아주 큰 값을 표현할 때이고 둘째는 정수가 아닌 소수를 표현할 때이다.
C언어와 비교하자면 C언어는 정해진 메모리에서 정확한 수를 알려주지만 크기가 정해진 메모리를 초과할 경우 받아들이지 못한다.
이에 반해 자바스크립트의 경우는 메모리의 크기가 정해져있지만 아주 큰 규모의 수도 받아들일 수 있다.
그러나 정해진 메모리에서 받아들이기 위해서는 의도적으로 가지고 있는 작은 단위의 숫자들을 버리게 되는데, 이는 정확하지 못한 수라는 단점을 도출한다.
###아주 큰 수의 경우
-
+1되면 마지막 자리의 숫자가 +1 된 결과가 나와야한다.
Math.pow(2, 52); //4503599627370496 Math.pow(2, 52)+1; //4503599627370497
-
+1되었는데 변화하지 않았으나, +2가 되어야 변화한다.
Math.pow(2, 53); //9007199254740992 Math.pow(2, 53)+1; //9007199254740992 Math.pow(2, 53)+2; //9007199254740994
-
+4가 되어야 변화한다.
Math.pow(2, 54); //18014398509481984 Math.pow(2, 54)+2; //18014398509481984 Math.pow(2, 54)+4; //18014398509481988
-
2의 n제곱수는 마지막이 0으로 끝날 수 없다.
Math.pow(2, 55); //36028797018963970 Math.pow(2, 56); //72057594037927940 Math.pow(2, 60); //1152921504606847000
-
+5했을 때 2의 n제곱수는 2의 배수로 끝날 수 없다.
Math.pow(2, 55)+5;//36028797018963976
정리하면 자바스크립트는 2^53 이상의 수에서는 의도적으로 수를 버리기 때문에 정확한 수를 측정하기에는 한계가 있다.
###소수일 경우
자바스크립트에는 소수일경우 정확한 소수가 존재하지 아니하고 소수가 되기위한 구간이 있다. 그 구간 안에 들어가면 특정한 소수라고 취급한다.
0.199999999999999997 //0.1999999999999999
0.199999999999999998 //0.2
0.199999999999999999 //0.2
0.20000000000000002 //0.2
0.20000000000000003 //0.20000000000000004
특정한 구간에 존재하는 수들이 0.2로 도출되기 때문에 값을 산술 계산 혹은 비교에서 조심해야 한다.
비교하는 구문에서는 Math.EPSILON을 사용해야 한다.
console.log(0.1 + 0.2 === 0.3) // false
console.log(Math.abs((0.1 + 0.2) - 0.3) < Number.EPSILON) // true
###NaN
NaN의 타입은 Number다.
Number지만 정해진 메모리에서 어긋나는 수를 자바스크립트에서 넣어줌으로써 “number가 아님”이라는 에러를 만들어주는 원리이다.
컴퓨터는 애매하지않은 것들, 크기가 정해지지 않은 것들은 false로 취급하므로 Boolean은 false다.
비어있는 문자열 ‘’역시 블린 값이 false이다.
비어져있는 메모리는 존재하지 않기 때문에 빈 문자열은 0값이 채우기 때문이다.
.메소드를 찍는 것은 자바스크립트에서 이제 앞에 존재하는 건 변수야라고 정의내려주는 것이다.
따라서 원시객체도 .메소드를 이용하면 일회성인 객체가 될 수 있다.
그러나 일회성인 객체는자바스크립트 내 기능인 가비지컬렉터에 의해 쓰이고 사라진다.