표준빌트인 객체중 하나여서 new
연산자와 함께 호출 하면 인스턴스를 생성한다.
값 없이 호출하면 내부슬롯 [[NumberData]]
에 0
을 할당하여 래퍼객체 생성함.
참고로 숫자가 아닌 값을 전달하면 강제형변환이 이루어진다.
const num = new Number("10");
num // [[NumberData]] : 10
메서드부분은 열거하며 적을 필요는 없어보인다.
단, 책에 나와있지 않지만 부동 소수점개념에 대해서는 잘 알 필요가 있다.
- floting point: 부동소수점(떠돌이 소수점). 실수를 컴퓨터상에서 표현할때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것.
- 이진수에서는 십진법의 소수가 정확히 표현되지 않고 근사치로표현 된다.
- 숫자는 보통 4byte(32bit) 공간에 저장된다.
- 부호부 (1비트) : 양수일 때는 0, 음수일 때는 1
지수부 (부호가 없는 정수, 8비트) : 8비트로 표시
정규화된 가수부 (부호가 없는 정수, 23비트) : 제일 앞의 비트는 정규화되었으므로 1이다.
위의 내용을 안다고 가정하며, 10진수(21.8125)를 2진수로 바꾸어보겠다.
- 양수이므로 부호부의 비트가 0이다.
- 소수점 위의
21
을 2진법으로 나타내면10101
이다.- 소수를 2진법으로 나타내는 방법은 2를 곱하여 정수부분을 취함.
0.8125*2
=>1.625
니까1
저장
0.625*2
=>1.25
니까1
저장
0.25*2
=>0.5
니까0
저장
0.5*2
=>1
이니까1
저장 후 끝.
따라서 소수부분은0.1101
이다.- 이를 정규화하면
0.101011101×2^5
이고 지수5
를 2진법으로 바꾸면101
이다.- 따라서 양수부호
0
,지수부호양수0
, 지수부000101
(8비트로 표시하니, 남은6비트를 사용한다), 가수부101011101000…
- 따라서
00000010110101110100000000000000
가 된다.
여기까지 따라왔다면, 문제점을 발견할 수 있다. 0.1
을 2진수로 변환해보겠다.
- 양수이므로 부호부의 비트 0
- 소수점위의
0
은0
- 소수를 2진법으로
0.1*2
=>0.2
니까0
0.2*2
=>0.4
이니까0
0.4*2
=>0.8
이니까0
0.8*2
=>1.6
이니까1
0.6*2
=>1.2
이니까1
0.2*2
=>0.4
이니까0
....여기서부터 반복된다.
이게 바로 부동소수점의 정밀도 문제다. 10진법 소수를 2진법 소수로 변경할때 무한소수가 필연적으로 발생하므로...
=> 10진법으로 1/3을 정확히 표현할 수 없는 이유와 비슷하다
공간이 유한한 메모리에 집어넣는 순간 이후값은 잘리는 현상이 발생한다.
이를 잘라내는 방식이 몇가지 존재하는데...궁금하면 나중에 알아보자.
아무튼 이런 방식으로 값을 저장하기에 0.1
은 사실 0.1
이 아니게된다.
만약 금융권이나 소수점이 굉장히 중요한 업계에 다닌다면, 큰 문제로 이어질수도있다.
이를 예방하는 방법은 의외로 간단하다.
10의 제곱을 곱해 소수부를 아예 없애버리고 나중에 연산을 하던지
아니면 메모리의 크기를 늘려 오차범위를 줄이던지(long double)
항상 뭐든지 알고 쓰는게 중요하다.
CS지식도 항상 옳다!!!
표준 빌트인 객체지만 생성자함수는 아니다.
=> 정적 프로퍼티와 메서드(static)만 제공한다.
다 알고있는 메서드니 넘어가도록 하였다...
Date()
로 선언하면 객체 대신 문자열로 나온다.
요정도 차이?
나머지는 자세하게 여기에서...