※ JS 숫자는 항상 64bit 부동 소수점이다.
다른 많은 프로그래밍 언어와 달리 JS는 정수
, short
, long
부동 소수점 등과 같은 다양한 유형의 숫자를 정의하지 않는다.
JS 숫자는 국제 IEEE 754 표준에 따라 항상 배정밀도 부동 소수점 숫자로 저장된다.
이 형식은 64bit로 숫자를 저장한다. 여기서 숫자(분수)는 비트0~51, 지수는 비트52~62, 부호는 비트63에 저장된다.
Value (aka Fraction/Mantissa) | Exponent | Sign |
---|---|---|
52 bits (0 - 51) | 11 bits (52 - 62) | 1 bit (63) |
정수(마침표 또는 지수 표기가 없는 숫자)는 최대 15자리까지 정확하다.
※ 최대 소수 자릿수는 17
.
부동 소수점 산술이 항상 100% 정확한 것은 아니다.
이러한 문제를 해결하려면 곱셈과 나눗셈의 도움이 필요하다.
만약 두 숫자를 더한다면, 결과는 숫자형식이다.
let x=10
let y=20
let z=x+y //z=30
만약 두 문자열을 더한다면, 결과는 문자형식이다.
let x = "10";
let y = "20";
let z = x + y; // z='1020'
만약 숫자와 문자열 순서로 더한다면, 결과는 문자형식이다.
let x = 10;
let y = "20";
let z = x + y; //z='1020'
만약 문자열과 숫자 순서로 더한다면, 결과는 문자형식이다.
let x = '10';
let y = 20;
let z = x + y; //z='1020'
일반적인 실수는 아래 코드의 결과를 30으로 예상하는 것이다.
let x = 10;
let y = 20;
let z = "The result is: " + x + y; // z='The result is:1020'
일반적인 실수는 이 결과가 102030일 것으로 예상하는 것이다.
let x = 10;
let y = 20;
let z = "30";
let result = x + y + z; // result='3030'
NaN - Not a Number※ JS 인터프리터는 왼쪽에서 오른쪽으로 작동한다.
x
와y
가 모두 숫자이기 때문에 처음10 + 20
이 추가된다.
JS 문자열에는 숫자 내용이 포함될 수 있다.
JS는 모든 숫자 연산에서 문자열을 숫자로 변환하려고 시도한다.
※ 마지막 예제에서 JS는 + 연산자를 사용하여 문자열을 연결한다.
NaN
은 숫자가 유효한 숫자가 아님을 나타내는 JS 예약어다.
숫자가 아닌 문자열로 산술을 시도하면 NaN
(숫자가 아님)이 된다 :
그러나 문자열에 숫자 값이 포함되어 있으면 결과는 숫자가 된다 :
전역 JS함수 isNaN()
을 사용하여 값이 숫자가 아닌지 확인할 수 있다 :
NaN
을 주의하자. 수학 연산에서 NaN
을 사용하면 결과도 NaN
이 된다 :
또는, 결과는 NaN5와 같은 연결일 수 있다 :
NaN
은 숫자다. typeof NaN
은 숫자를 반환한다 :
Infinity
(또는 -Infinity)는 가능한 가장 큰 수 이외의 수를 계산하는 경우 JS가 반환하는 값이다.
아래 코드로 myNumber 숫자를 JS에서 표한할 수 있는 최대치의 숫자 이사을 만들기 위해
반복해서 제곱 계산을 반복문이다. 결과와 같이 최대치를 넘어가면 INFINITY
를 반환하였다.
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Numbers</h2>
<p>Infinity is returned if you calculate a number outside the largest possible number:</p>
<p id="demo"></p>
<script>
let myNumber = 2;
let txt = "";
while (myNumber != Infinity) {
myNumber = myNumber * myNumber;
txt = txt + myNumber + "<br>"; // "<br>"는 줄 바꿈 break of line
}
document.getElementById("demo").innerHTML = txt;
</script>
</body>
</html>
0
(Zero)로 나누기도 문한대를 생성한다 :
Infinity
는 하나의 숫자이다. 그래서 typeof infinity
는 숫자를 반환한다 :
JS는 상수 앞에 0x
가 있으면 16진수로 해석한다.
※ 앞에
0
이 들어가도록 숫자를 쓰면 안된다(예 : 07)
일부 JS 버전은0
으로 시작되는 숫자를 8진수로 해석한다.
기본적으로 JS는 숫자를 base 10(10진법)으로 표시한다.
그러나, toString()
메서드를 사용하여 base 2(2진수)에서 base 36(36진수)로 숫자를 출력할 수 있다.
16진수는 base 16
이다.
10진수는 base 10
이다.
8진수는 base 8
이다.
2진수는 base 2
이다
일반적으로 JS숫자는 리터럴에서 생성된 기본 값이다.
그러나, 숫자는 키워드 new
를 사용하여 객체로 정의할 수도 있다 :
타입은 숫자와 객체로 나뉜다.
※ Number(숫자) 객체를 생성하면 안된다.
new
키워드는 코드를 복잡하게 만들고 실행 속도를 늦춘다.
숫자 객체는 예상치 못한 결과를 생성할 수 있다 :
숫자와 ==
비교 결과 :
숫자와 ===
비교 결과 :
==
와===
의 차이점에 주목해야 하는데, 객체끼리의 비교는 항상false
를 리턴한다.
완전한 Number에 대한 참고는 아래 주소를 참조하자.
참조 사이트에는 모든 Number 속성 및 메서드에 대한 설명과 예시가 있다.
(참조 : https://www.w3schools.com/jsref/jsref_obj_number.asp)