ํํ ์ฐ๋ฆฌ๊ฐ ์ซ์ํ ํ์ ์ ๋ ์ฌ๋ฆฌ๋ฉด ์ ์, ์์ฐ์, ์ค์, ๋ณต์์ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ํํ๋ฅผ ๋ ์ฌ๋ฆฐ๋ค.
double, int, float
๊ทธ๋ผ JS๋ ์ด๋จ๊น?
๋๋๊ฒ๋ JS์ ์กด์ฌํ๋ ์ซ์ํ์
์ number ์ค์ง ํ๊ฐ์ด๋ค. ์ฆ, number๊ฐ ์ ์ ๋ถ๋ ์์์ ์ซ์๋ฅผ ๋ชจ๋ ์์ฐ๋ฅธ๋ค.
๐ก JS์๋ ์ง์ ํ ์ ์๊ฐ ์๋ค๋ ์ด์ ๋ก ์ค๋ซ๋์ ์์ ๋จน์๋ค! ๋ฐ๋ผ์ JS์์ ์ ์๋ ๋ถ๋ ์์์ ์ด ์๋ ๊ฐ์ด๋ค. (ex 42.0 === 42)
ํ๋์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ "IEEE 754 ํ์ค(๋ถ๋ ์์ซ์ ํ์ค)์ ๋ฐ๋ฅธ๋ค. JS์ number๋ ์ด๋ฅผ ๋ฐ๋ฅด๋ฉฐ ๊ทธ์ค์์๋ ์ ํํ "๋ฐฐ ์ ๋" ํ์ค ํฌ๋งท(64๋นํธ ๋ฐ์ด๋๋ฆฌ)์ ์ฌ์ฉํ๋ค.
.
.
.
JS์์ ๋ณ์์ ์ซ์๋ฅผ ๋์ ํ๋ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
var a = 42;
var b = 42.3;
var a = 0.42;
var b = .42;
var a = 42.0;
var b = 42.;
/*
42.๊ณผ ๊ฐ์ด ํํํ๋ ๊ฒ์ ํ๋ฆฐ ํํ์ ์๋์ง๋ง ๋ค๋ฅธ์ฌ๋์ด ์ฝ๋๋ฅผ ์ฝ์๋
ํผ๋ํ ์ ์์ผ๋ ์์ ๊ฐ์ ํํ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋ค!
*/
var a = 42.300;
var b = 42.0;
a;// 42.3
b;// 42
var a = 5E10;
a;// 50000000000;
a.toExponential(); // 5e+10
var b = a * a;
b;// 2.5e+21
var c = 1 / a;
c; // 2e-11
๐ก ๊ฐ์ฒด ๋ํผ๋? "์์ ํ์ ์ ๊ฐ์ ๊ฐ์ธ๋ ํํ์ ๊ฐ์ฒด๋ค. number, string, boolean, symbol ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋์ํ๋ Number, String, Boolean, Symbol์ด ์ ๊ณต๋๋ค. ์ด๋ JS๊ฐ ์์์ ์ฒ๋ฆฌ ํด์ค๋ค.
var a = 42.59;
a.toFixed(0); // "43"
a.toFixed(1); // "42.6"
a.toFixed(2); // "42.59"
a.toFixed(3); // "42.590"
a.toFixed(4); // "42.5900"
์ค์ ๋ก๋ ์ซ์ ๊ฐ์ ๋ฌธ์์ด ํํ๋ก ๋ฐํํ๋ฉฐ ์๋ ๊ฐ์ ์์์ ์ดํ ์ซ์๋ณด๋ค ๋๋ง์ ์๋ฆฟ์๋ฅผ ์ง์ ํ๋ฉด 0์ด ์ฐ์ธก์ ๋ถ๋๋ค. toPrecision()๋ ๊ธฐ๋ฅ์ ๋น์ทํ์ง๋ง ์ ํจ ์ซ์ ๊ฐ์๋ฅผ ์ง์ ํ ์ ์๋ค.
var a = 42.59;
a.toPrecision(1); // "4e+1"
a.toPrecision(2); // "43"
a.toPrecision(3); // "42.6"
a.toPrecision(4); // "42.59"
a.toPrecision(5); // "42.590"
a.toPrecision(6); // "42.5900"
๐ฅ ์ด๋ ๋ณ์์ ํ๋กํผํฐ์ ์ ๊ทผํ ๋์ ๊ฐ์ฒด ๋ํผ๊ฐ ์์๋ก ์์ฑ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์์ ํ์ ์ด ํ๋กํผํฐ๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒ๋ผ ์กด์ฌํ๋ฉฐ ์ง์๋์ง ์๋๋ค!
๋ํ ๊ฐ์ฒด ๋ํผ๋ ์์ ํ์ ๊ณผ ๋๋ฑํ ๊ฐ์ด์ง๋ง ์ผ์นํ์ง ์๋๋ค.
var a = 1
var b = new Number(a);
a == b; // true
a === b; // false
var s = "test-test";
s.len = 4; // new String(s).len = 4
console.debug(s.len); // undefined
var s = "test-test";
s.length = 4;
console.debug(s.length); // 9
/*
์์์ ์ ์ ์๋ ์ฌ์ค์ 1๋ฒ์งธ ์ค์ s๋ ์์ ํ์
๋ณ์ ์ด์ง๋ง
๋๋ฒ์งธ ์ค์ s๋ ์ ํ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์จ๋ค๋ ๊ฒ์ ์ ์ ์๋ค?
*/
์ ๊ทธ๋ผ ๋ค์ ๋ฌธ๋ฒ์ค ์๋ชป๋ ๊ฒ์ ๊ณจ๋ผ๋ณด์!
42.toFixed(3);
(42).toFixed(3);
0.42.toFixed(3);
42..toFixed(3);
42 .toFixed(3);
์ ๋ต์ ์๋์ ๊ฐ๋ค.
42.toFixed(3); // SyntaxError
(42).toFixed(3); // "42.000"
0.42.toFixed(3); // "0.420"
42..toFixed(3); // "42.000"
42 .toFixed(3); // "42.000"
์ด? 1๋ฒ์ ์ ๋ฌธ๋ฒ ์ค๋ฅ์ง ๋ฒ๊ทผ๊ฐ? ๐คฎ
42.toFixed(3)์์ ๋ฌธ๋ฒ์ค๋ฅ๊ฐ ๋ ์ด์ ๋ .์ด toFeixed()์ ์ ๊ทผํ๋ ์ฐ์ฐ์๊ฐ ์๋๋ผ 42.์ ๋ถ๋์์์ ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ด๋ค.
var oneThousand = 1E3; // 1 * 10^3
var oneMillionOneHundredThousand = 1.1E6; // 1.1 * 10^6
0xf3; // 243์ 16์ง์
0Xf3; // ์์ ๊ฐ์
0363; // 243์ 8์ง์ (ES6 + ์๊ฒฉ๋ชจ๋์์๋ ์ฌ์ฉํ์ง ๋ชปํ๋ค.)
//ES6
0o363; // 243์ 8์ง์
0O363; // ์์ ๊ฐ์
0b11110011; // 243์ 2์ง์
0B11110011; // ์์ ๊ฐ์
/*
๋๋๋ก์ด๋ฉด 0x, 0b, 0o์ ๊ฐ์ด ์์์ ์ผ๋ก ํ๊ธฐํ์....
๋๋ฌธ์๋ก ํ๊ธฐํ๋ฉด ๊ฐ๋
์ฑ๋ ๋จ์ด์ง๊ณ ๋์ํ๋ค
*/
.
.
.
JS์์ ๋๋ฆฌ ์๋ ค์ง ์ด์ง ๋ถ๋ ์์์ ์ซ์์ ๋ถ์์ฉ ๋ฌธ์ ๋ค.
(์ฌ์ค ์ด๋ IEEE 754 ํ์ค์ ๋ฐ๋ฅด๋ ๋ชจ๋ ์ธ์ด์์ ๊ณตํต์ ์ธ ๋ฌธ์ ๋ค. ๋๋ฌด JS๋ง ๋ญ๋ผ ๊ทธ๋ฌ์ง ๋ง์๐ญ)
0.1 + 0.2 === 0.3; // false
์ฅ ์์๋ง ๋ณด๋ฉด true๊ฐ ์ ์์ด์ง ์์๊ฐ? ๊ทผ๋ฐ ๊ฐ์ false๋ค.
์ด๋ ์ฝ๊ฒ ๋งํ๋ฉด ์ด์ง ๋ถ๋ ์์์ ์ผ๋ก ๋ํ๋ธ 0.1๊ณผ 0.2๋ ์๋์ ์ซ์์ ์ผ์นํ์ง ์๋๋ค. ๊ทธ๋์ ๋์ ๋ํ ๊ฐ์ ์ ํํ 0.3์ด ์๋๋ค. ์ค์ ๋ก๋ 0.30000000000000004์ ๊ฐ๊น๋ค.
๊ทธ๋๋ ์์ฌํด๋ ์ข๋ค. ๋ง์ JSํ๋ก๊ทธ๋จ์ ๋ณดํต ์ ์ฒด์(0, ์ ์)๋ง์ ๊ทธ๊ฒ๋ ๊ธฐ๊ป ๋ฐฑ๋ง์ด๋ ์กฐ ๋จ์ ๊ท๋ชจ์ ์ซ์๋ฅผ ๋ค๋ฃฌ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์์์ ์ด๋ป๊ฒ ๋น๊ตํด์ผ ํ ๊น?
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋ฏธ์ธํ ๋ฐ์ฌ๋ฆผ ์ค์ฐจ๋ฅผ ํ์ฉ ๊ณต์ฐจ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ ๊ฒ ๋ฏธ์ธํ ์ค์ฐจ๋ฅผ '๋จธ์ ์
์ค๋ก '์ด๋ผ๊ณ ํ๋๋ฐ, JS์ ๋จธ์ ์
์ค๋ก ์ 2^-52(2.220446049250313e-16)์ด๋ค.
ES6๋ถํฐ๋ Number.EPSILON์ผ๋ก ๋ฏธ๋ฆฌ ์ ์๋์ด์๊ณ ์ด์ ๋ธ๋ผ์ฐ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ํด๋ฆฌํ(์น ๊ฐ๋ฐ์์ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ ์น ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ฝ๋๋ฅผ ๋ปํ๋ค.)์ ๋์ ์ฌ์ฉํ๋ค.
if(!Number.EPSILON){
Number.EPSILON = Math.pow(2,-52);
์ ๊ทธ๋ฌ๋ฉด ๋ง๋ค์ด ๋ณด์!
function Equal(x, y){
return Math.abs(x - y) < NUMBER.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
Equal(a,b); // true
Equal(0.0000001, 0.0000002); // false
.
.
.
์ซ์๋ฅผ ํํํ๋ ๋ฐฉ์์ด ์ด๋ ๋ค๋ณด๋ ์ ์๋ Number.MAX_VALUE๋ณด๋ค ํจ์ฌ ์์ ์์ค์์ ์์ ๋ฒ์๊ฐ ์ค์ ๋์ด ์๋ค.
์ด ๊ฐ์ ES6์์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ๋์ด์๋ค.
์ธ ์๋ฆฌ ์ฝค๋ง๋ฅผ ์ฐ์ด๋ณด๋ฉด ์ผ์ถ 9์ฒ ์กฐ๊ฐ ๋๋๋ค. (์์ฃผ ๋๋ด์ฃผ๊ฒ ์ฌ์ ๋กญ๋ค!๐คค)
JS์์ ์์ฃผ ํฐ ์ซ์๋ฅผ ๋ง์ฃผํ ๋๋ DB์์ 64๋นํธ๋ก ๋ ID๋ฅผ ์ฒ๋ฆฌํ ๋๊ฐ ๋๋ถ๋ถ์ด๋ค. ๊ทธ๋ด๋๋ stringํ์
์ผ๋ก ์ ์ฅํ์ ์๋ ํฐ ์ ์ ํธ๋ฆฌํฐ ์ฌ์ฉ์ ๊ถํ๋ค.
.
.
.
ES6๋ถํฐ๋ Number.isInteger()๋ก ์ด๋ค ๊ฐ์ ์ ์ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
Number.isInteger(42); // true
Number.isInteger(42.000); // true
Number.isInteger(42.3); // false
ES6 ์ด์ ์ ์ํ ํด๋ฆฌํ์ ๋ค์๊ณผ ๊ฐ๋ค.
if (!Number.isInteger){
Number.isInteger = function(num){
return typeof num == "number" && num % 1 == 0;
};
}
์์ ํ ์ ์ ์ฌ๋ถ๋ ES6๋ถํฐ Number.isSafeInteger()๋ก ์ฒดํฌํ๋ค.
Number.isSafeInteger(Number.MAX_SAFE_INTEGER); //true
Number.isSafeInteger(Math.pow(2, 53)); // false
Number.isSafeInteger(Math.pow(2, 53) -1); // true
ํด๋ฆฌํ์ ๋ค์๊ณผ ๊ฐ๋ค.
if(!Number.isSafeInteger){
Number.isSafeInteger = function(num){
return Number.isInteger(num) && Math.abs(num) <= Number.MAX_SAFE_INTEGER;
};
}
.
.
.
์ ์์ ์์ ๋ฒ์๊ฐ 9์ฒ ์กฐ (53๋นํธ)์ ์ด๋ฅด์ง๋ง (๋นํธ ์ฐ์ฐ์ฒ๋ผ) 32๋นํธ ์ซ์์๋ง ๊ฐ๋ฅํ ์ฐ์ฐ์ด ์์ผ๋ฏ๋ก ์ค์ ๋ฒ์๋ ํจ์ฌ ์ค์ด๋ ๋ค.
๋ฐ๋ผ์ ์ ์์ ์์ ๋ฒ์๋ Math.pow(-2,31)์์ Math.pow(2, 31) -1 ๊น์ง์ด๋ค.
a|0๊ณผ ๊ฐ์ด ์ฐ๋ฉด "์ซ์ ๊ฐ -> 32๋นํธ ๋ถํธ ์๋ ์ ์"๋ก ๊ฐ์ ๋ณํํ๋ค. ์ด๋ 32๋นํธ ์ ์๊ฐ์๋ง ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด๋ค. 0๊ณผ OR์ ์ฐ์ฐ์ ๋ณธ์ง์ ์ผ๋ก NOOP๋นํธ ์ฐ์ฐ๊ณผ ๊ฐ๋ค.
๐ก NAN, Infinity ๋ฑ ์ผ๋ถ ํน์ ๊ฐ์ 32๋นํธ์์ ์์ ํ์ง ์๋ค. ์ด๋ค์ ๋นํธ ์ฐ์ฐ ํ๋ฉด ToInt32(๊ฐ์ ๋ณํ) ์ถ์ ์ฐ์ฐ์ ํตํด ๋นํธ ์ฐ์ฐ ๋ณธ์ฐ์ ๊ธฐ๋ฅ์ ์ํํ๊ณ ๊ฑ๊ณผ๋+0์ด ๋๋ค.
.
.
.
์ค๋์ JS๊ฐ ์ซ์๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ณด์๋ค.
ํ์คํ ๋ค๋ฃจ๋ ๋น์ค์ด ์ปค ๋ค๋ฅธ ์์ํ์
๋ณด๋ค ํจ์ฌ ๋ด์ฉ์ด ๋ง๊ณ ์ฃผ์ ํ ์ ์ด ๋ง์๋ค.
ํนํ ์ซ์ ํ์
์ ์ฝ๋ฉํ๋ฉด์ ์ธ์ผ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ ์์งํ ํ์๊ฐ ์๋ค!๐ฅ๐ฅ๐ฅ
(์๊ทธ๋ผ ์ค๋ฅ ๋ฟ์ผ๋๊น..... JS๋ ์ค๋ฅ๋ฟ์ด๋ ์คํ๋๋๊น....๐คฎ๐คฎ๐คฎ๐คฎ๐คฎ)
.
.
.
๐ฆ ๊ฐ์ฒด ๋ํผ๋?
https://developerntraveler.tistory.com/24
๐ฆ ํด๋ฆฌํ์ด๋?
https://ko.wikipedia.org/wiki/%ED%8F%B4%EB%A6%AC%ED%95%84_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)