JavaScript에서 모든 숫자는 IEEE 754 국제 표준에서 정의한 64비트 부동 소수점 수로 저장된다.
64비트 부동 소수점 수의 정밀도의 유효성은 정수부 15자리, 소수부는 17자리까지만 보장된다.
위의 예제에서 변수 x 값은 999999999999999 (15개의 9)로 제대로 출력되지만,
변수 y는 정수부가 16자리로 유효 범위를 넘어 출력 결과
10000000000000000 17개의 정수부로 처리되는 것을 확인할 수 있다.
소수부의 경우를 보면,
0.3을 직접 변수에 대입해서 출력한 경우 제대로 출력되지만,
var z 에 a + b 를 대입해서 출력 한 결과는 0.30000000000000004 로
오차가 발생함을 확인할 수 있다.
이러한 오차 발생은 JavaScript만의 문제는 아니고,
부동 소수점 수를 가지고 실수를 표현하는 모든 프로그래밍 언어에서 발생하는 문제이다.
정수의 형태로 먼저 변환해서 계산을 수행하고 다시 실수 형태로 재변환하는 방법을 사용할 수 있다.
실행 결과 : 0.3
소수 형태인 변수 a1, b1에 10을 곱해 정수 형태로 만들고
계산 수행 후 다시 10으로 나눠 변수 z1에 대입하고 그 값을 출력하면
0.3으로 오차 없이 출력되는 걸 확인할 수 있다.
숫자 형태의 리터럴에 toString() 메서드를 사용하여
해당 숫자를 여러 형태의 진법으로 변환할 수 있다.
헤당 숫자의 진법을 실제로 바꿔주는 것은 아니고,
전달된 진법으로 변환한 형태의 숫자를 문자열 형태로 출력하는 것 뿐이다.
혼동하기 쉬운 4가지 개념의 각 문맥에서의 값을 정리한다.
Boolean 변환시 0이 아닌 모든 숫자는 true 값을 갖는다.
Infinity는 number 타입이면서 0이 아니기 때문에 true.
Number 변환시 null 과 undefined 의 값 다름을 주의.
String 변환시 문자열로 변환되어 그대로 출력된다.
new Number("숫자로 된 문자열");, new Number(true 또는 false);
수를 사용할 때 new 연산자를 사용해서 명시적으로 Number 객체를 생성할 수 있다.
Number 객체는 숫자 값을 감싸고 있는 래퍼(Wrapper) 객체이다.
객체이기 때문에 type은 object 임에 주의.
var myNum = new Number(인수); 형태의 코드로
숫자값을 Number 객체에 저장해야 메서드를 사용할 수 있다.
숫자.toFixed(), 숫자.toFixed(정수 인수)
소수점 이하 (정수 인수 +1) 자리수에서 반올림 처리
Number 인스턴스의 가수와 소수 부분을 합친 자릿수를 전달받은 값으로 고정한 후
그 값을 문자열로 반환한다.
numObj.toPrecision(전체자릿수)
인수가 없으면 인스턴스의 숫자를 그대로 문자열로 반환하고,
전달받은 값이 있으면 반올림해서 고정한 자릿수의 자리까지를 반환한다.