[TCP School/자바스크립트] 표준 객체 - Number 객체
자바스크립트에서의 수 표현
자바스크립트에서는 정수와 실수를 따로 구분하지 않고, 모든 수를 실수 하나로만 표현한다.
자바스크립트에서 모든 숫자는 IEEE 754 국제 표준에서 정의한 64비트 부동 소수점 수로 저장된다.
64비트 부동 소수점 수는 메모리에 다음과 같은 형태로 저장된다.
0 ~ 51 비트 | 52 ~ 62 비트 | 63비트 |
총 52비트의 가수 부분 | 총 11비트의 지수 부분 | 총 1비트의 부호 부분 |
이러한 64비트 부동 소수점 수의 정밀도는 정수부는 15자리까지, 소수부는 17자리까지만 유효하다.
var x = 999999999999999;
var y = 9999999999999999;
var z = 0.1 + 0.2;
x // 999999999999999
y // 10000000000000000
z // 0.30000000000000004
위 예제에서 변수 z의 값을 보면 오차가 발생했음을 알 수 있다.
이렇게 부동 소수점 수를 가지고 수행하는 산술 연산의 결과값은 언제나 오차가 발생할 가능성을 가지고 있다.
이것은 자바스크립트만의 문제가 아니라 부동 소수점 수를 가지고 실수를 표현하는 모든 프로그래밍 언어에서의 문제점이다.
https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90
부동소수점 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 초기의 전기기계식 프로그래밍 가능한 컴퓨터 Z3에는 부동소수점 산술 기능이 포함되었다. (뮌헨의 국립 독일 박물관) 부동소수점(浮動小數點, floating point) 또
ko.wikipedia.org
https://mirrorofcode.tistory.com/324
(운영체제) 부동 소수점과 이에 따른 문제점(vs 고정 소수점)
오늘은 면접에서 질문 받은 것 중에서 기억에 남는 부동 소수점에 관련된 문제에 대해서 얘기해보려 한다. (사실 카테고리가 운영체제가 맞는지도 의문이다.) 뭐든지 그 세부사항을 알려면 그
mirrorofcode.tistory.com
자바스크립트에서는 이러한 오차를 없애기 위해 정수의 형태로 먼저 변환하여 계산을 수행하고, 다시 실수의 형태로 재변환하는 방법을 사용할 수도 있다.
var z = (0.2 * 10 + 0.1 * 10) / 10; // 0.3
진법 표현
자바스크립트에서는 기본적으로 10진법을 사용하여 수를 표현한다.
하지만 0x 접두사를 사용하여 16진법으로 수를 표현할 수도 있다.
var x = 0xAB; // 16진법으로 표현된 10진수 171
var y = 29; // 10진법으로 표현된 29
x + y; // 두 수 모두 10진법으로 자동 변환되어 계산됨 -> 200
위 예제처럼 자바스크립트에서는 산술 연산 시 모든 수가 10진수로 자동 변환되어 계산된다.
또한, 숫자에 toString() 메소드를 사용하여 해당 숫자를 여러 진법의 형태로 변환할 수 있다.
var num = 256;
num.toString(2); // 2진법으로 변환 : 100000000
num.toString(8); // 8진법으로 변환 : 400
num.toString(10); // 10진법으로 변환 : 256
num.toString(16); // 16진법으로 변환 : 100
(num.toString(2) / 2) // 문자열을 숫자로 나눴기 때문에 자동으로 10진수로 변환되어 산술 연산됨. 50000000
toString() 메소드는 해당 숫자의 진법을 실제로 바꿔주는 것이 아닌, 전달된 진법으로 변환된 형태의 문자열을 반환해 주는 것이다.
Infinity
자바스크립트에서는 양의 무한대를 의미하는 Infinity와 음의 무한대를 의미하는 -Infinity 값을 사용할 수 있다.
Infinity값은 사용자가 임의로 수정할 수 없는 읽기 전용 값이며, 자바스크립트의 어떤 수보다도 큰 수로 취급받는다.
var x = 10 / 0;
var y = Infinity * 1000;
var z = 1 / Infinity;
x; // Infinity
y; // Infinity
z; // -Infinity
NaN
NaN(Not A Number)은 숫자가 아니라는 의미로, 정의되지 않은 값이나 표현할 수 없는 값을 가리킨다.
0을 0으로 나누거나, 숫자로 변환할 수 없는 피연산자로 산술 연산을 시도하는 경우에 반환되는 읽기 전용 값이다.
var x = 100 - '10'; // 문자열 10은 자동으로 숫자로 변환되어 계산됨
var y = 100 - '문자열'; // '문자열'은 숫자로 변환될 수 없기 때문에 NaN을 반환함
var z = 0 / 0; // 0을 0으로 나눌 수 없기 때문에 NaN을 반환함
x; // 90
y; // NaN
z; // NaN
자바스크립트의 전역 함수 중 하나인 isNaN() 함수를 사용하면, 전달받은 값이 숫자인지 아닌지를 판별해 준다.
var x = 100 * '문자열';
if (isNaN(x))
document.write('변수 x의 값은 숫자가 아닙니다.');
else
document.write('변수 x의 값은 숫자입니다.')
unll, undefined, NaN, Infinity에 대한 비교
- null은 Object 타입이며, 아직 '값'이 정해지지 않은 것을 의미하는 값이다.
- undefined는 null과 달리 하나의 타입이며, '타입'이 정해지지 않은 것을 의미하는 값이기도 하다.
- NaN은 number 타입이며, '숫자가 아님'을 의미하는 숫자이다.
- Infinity는 numer 타입이며, '무한대'를 의미하는 숫자이다.
자바스크립트는 타입 검사가 매우 유연한 언어이다.
따라서 위의 값들 또한 문맥에 따라 다음과 같이 자동으로 형변환이 이루어진다.
값 | Boolean 문맥 | Number 문맥 | String 문맥 |
null | false | 0 | 'null' |
undefined | false | NaN | 'undefined' |
NaN | false | NaN | 'NaN' |
Infinity | true | Infinity | 'Infinity' |
Number 객체
자바스크립트에서 숫자는 보통 숫자 리터럴을 사용해 표현한다.
하지만 숫자를 나타낼 때 new 연산자를 사용하여 명시적으로 Number 객체를 생성할 수도 있다.
이러한 Number 객체는 숫자 값을 감싸고 있는 래퍼 객체이다.
var x = 100; // 숫자 리터럴
var y = new Number(100); // Number 객체
x; // 100
y; // 100
typeof x; // number 타입
typeof y; // object 타입
x == y // true
x === y // false
new 연산자를 사용하여 객체를 생성할 때는 매우 많은 추가 연산이 필요하기 때문에
가능한 숫자 리터럴을 사용해서 수를 표현하고, Number 객체는 래퍼 객체로만 활용하는 것이 좋다.
TCP School의 강의 내용을 정리한 포스트입니다.
http://www.tcpschool.com/javascript/intro
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'공부 > JavaScript' 카테고리의 다른 글
[TCP School/자바스크립트] 표준 객체 - Date 객체 (0) | 2023.04.21 |
---|---|
[TCP School/자바스크립트] 표준 객체 - Math 객체 (0) | 2023.04.21 |
[TCP School/자바스크립트] 표준 객체 - 전역 객체와 래퍼 객체 (0) | 2023.04.20 |
[TCP School/자바스크립트] 객체 - 객체 다루기 (0) | 2023.04.19 |
[TCP School/자바스크립트] 객체 - 프로토타입 (0) | 2023.04.19 |