프로그래밍 언어에서 숫자 연산 덕분에 숫자 값을 계산할 수 있다.
JS의 숫자 연산에는 다음과 같은 것들이 있다.
+
: 덧셈-
: 뺄셈/
: 나눗셈*
: 곱셈%
: 나머지 연산위의 연산자들은 다른 프로그래밍 언어에서도 일반적으로 사용되며 JS에 한정된 것은 아니다.
JS는 숫자에 대해 부호 (1비트), 지수(11비트), 소수(52비트) 총 64비트로 이루어진 부동소수점 표현을 사용한다. (JS가 모든 숫자를 나타낼 때 부동소수점을 사용한다... 정로도만 이해하자)
JS가 모든 숫자를 나타낼 때 부동소수점을 사용하기 떄문에 정수 나눗셈은 소용이 없다.
JAVA와 같은 프로그래밍 언어에서 정수 나눗셈의 결과는 해당 나누기의 몫이다.
JAVA : 5/4 === 1
JS : 5/4 ===1.25
자바에서는 명시적으로 데이터 형식을 선언해야 하기 때문이다.
ex) int , float ...
따라서 결과는 부동 소수점이 될 수 없다.
JS에서 정수 나눗셈을 하길 원한다면 다음 중 하나를 사용해야 한다.
Math.floor - 가장 가까운 정수로 내림한다.
Math.round - 가장 가까운 정수로 반올림한다.
Math.ceil - 가장 가까운 정수로 올림한다.
Number.EPSILON은 두 개의 표현 가능한 숫자 사이의 가장 작은 간격을 반환한다.
이는 부동소수점 근사치를 활용해 분수가 제대로 표현되지 않는 문제를 해결하는 데 유용하다.
function numberEquals(x,y){
return Math.abs(x-y) < Number.EPSILON
}
numberEquals(0.1 + 0.2 ,0.3); true
// JS에서는 십진분수로 인해 소수점 연산을 정확하게 표현할 수 없다.
ex) 0.1+0.2 === 0.3 //false
0.1+0.11 ===0.12 //false
Number.MAX_SAFE_INTEGER는 가장 큰 정수를 반환한다.
Number.MAX_SAFE_INTEGER+1 ===Number.MAX_SAFE_INTEGER + 2 //true
위의 코드에서 두 수는 더 이상 커질 수 없기 때문에 true를 반환한다.
하지만 위의 코드를 부동소수점과 같이 사ㅇㅇ하면 제대로 동작하지 않으면 결과는 false이다.
Number.MAX_SAFE_INTEGER +1.111 ===Number.MAX_SAFE_INTEGER +2.022 //false
Number.MAX_VALUE는 가능한 가장 큰 부동 소수점을 반환한다.
Number.MAX_VALUE는 1.7976931348623157e +308 라고한다
(뭔지는 모르겠다)
Number.MAX_VALUE +1 === Number.MAX_VALUE +2 //true
Number.MAX_VALUE +1.111 ===Number.MAX_VALUE+2.022 //true
Number.MAX_SAFE_INTEGER 와는 다르게 부동소수점에 대해서도 잘 동작한다.
Number.MIN_SAFE_INTEGER는 가장 작은 정수를 반환한다.
Number.MIN_SAFE_INTEGER는 -9007199254740991이다.
Number.MIN_SAFE_INTEGER -1 === Number.MIN_SAFE_INTEGER -2 //true
위의 코드에서 두 수가 더 이상 작아질 수 없기 때문에 true를 반환한다.
하지만 역시 부동소수점과 함께 사용하면 제대로 동작하지 않는다.
Number.MIN_VALUE는 JavaScript에서 표현할 수 있는, 0에 가장 가깝지만 음수는 아닌 수이다.
Number.MIN_VALUE는 5e-324 이다.
Number.MAX_VALUE 보다 큰 유일한 것은 Infinity 이고 Number.MIN_SAFE_INTEGER보다 작은 유일한 것은 -Infinity이다.
-Infinity < Number.MIN_SAFE_INTERGER < 0 < Number.MIN_VALUE < Number.MAX_SAFE_INTEGER < Number.MAX_VALUE < Infinity
위의 코드와 같이 JS 숫자의 크기를 가장 작은 것(왼쪽)부터 가장 큰 것(오른쪽) 순으로 요약했다.