(3장) 타입, 값, 변수 - 1. 숫자(Number), BigInt [자바스크립트 완벽 가이드 7판]

iberis2·2022년 12월 25일
0

3장 타입, 값, 변수

자바스크립트의 타입

1. 숫자(Number)
2. BigInt
3. 문자열(String)
4. Boolean
5. Null, Undefined
6. Symbol
7. 객체(Object)와 배열(Array)
    - Set 객체 : 값의 집합
    - Map 객체 : 키와 값의 연결
    - 형식화 배열 : 바이트 배열과 다른 이진 데이터를 연결
    - Date 타입 : 날짜 , 시간 표현
    - Error 타입
    - 함수
    - 클래스
    - RegExp 타입: 텍스트 패턴
    (문자열에서 정교한 매칭, 검색, 대체 동작을 할 수 있다)


1. 숫자(number)

진수표현방법예시10진수 값
10진수1, 2, 3 ... 9
2진수0b(또는 0B)0b1010121
8진수0o(또는 0O)0o377255
16진수0x(또는 0X)
0부터 9까지의 숫자나 a(A)부터 f(F)까지 문자
0xff255 (15 * 16 +15)
16진수문자는 10부터 15까지를 나타냄0xBADCAFE195939070

(1) 산술연산자

  • 기본 : +, -, *, /, %(나머지 연산자), ** (제곱 연산자)

Math 연산자Math 연산자
Math.pow(num1, num2)num1의 num2제곱Math.round(num)반올림
Math.ceil(num)올림Math.floor(num)내림
Math.abs(num)절대값Math.max(num1, num2, num3)가장 큰 값
Math.min(num1, num2, num3)가장 작은 값Math.random()0 ~ 1.0 미만 랜덤 숫자
Math.PI원주율Math.sqrt(num)루트num (num의 0.5 제곱근)
그 외 Math 함수

(2) Infinity, -Infinity

0으로 나누거나, JavaScript에서 표현할 수 있는 값의 초과 (또는 미만)의 값은 Infinity (또는 -Infinity)을 반환한다.

Infinity | 표현하기에 너무 큰 양수

console.log(Number.POSITIVE_INFINITY); //Infinity
console.log(1 / 0); // Infinity
console.log(Number.MAX_VALUE * 2); // Infinity

-Infinity | 표현하기에 절대값이 너무 큰 음수

console.log(Number.NEGATIVE_INFINITY); // -Infinity
console.log(-1 / 0); // -Infinity
console.log(-Number.MAX_VALUE * 2); // -Infinity
  • 표현할 수 있는 가장 작은 양수(또는 음수)보다도 0에 가까운 경우 0(또는 -0)을 반환한다. (0과 -0은 거의 같음)


(3) NaN : 숫자가 아닌 값을 숫자로 표현할 때 사용

console.log(typeof NaN); // number
console.log(Number.NaN); // NaN
console.log(0 / 0); // NaN
console.log(Infinity / Infinity); // NaN

Number.isNaN(num) num가 NaN인지 확인

num이 NaN이거나, 숫자가 아니면서 숫자로 변환할 수도 없는 값일 때 경우 true

  • NaN은 자기 자신을 포함해 어떤 값과도 같지 않아,
    num === NaN 으로 확인할 수 없다.
  • num != num 또는 Number.isNaN(num)로 확인해야 함
let noNum = 0 / 0;
console.log(noNum); //NaN

console.log(noNum === NaN); // false

console.log(Number.isNaN(noNum)); //true
console.log(noNum != noNum); //true
console.log(noNum !== noNum); //true

Number.isFinite(num) num가 유한한 숫자인지 확인

num이 NaN, Infinity, -Infinity가 아니고, 유한한 숫자(일반적인 숫자)이거나 유한한 숫자로 변환할 수 있으면 true

let num = 100;
console.log(Number.isFinite(num)); // true

let noNum = 0 / 0;
console.log(Number.isFinite(noNum)); // false

(4) 소수 반올림 오류

10진법을 프로그래밍 언어에서 사용하는 2진법으로 전환시 무한 소수가 발생하며, 반올림 오류가 발생하게 된다. (무한 소수 = 1/3의 소수 표현처럼 끝없이 이어지는 수)

let num1 = 0.3 - 0.2; //0.3 빼기 0.2
let num2 = 0.2 - 0.1; //0.2 빼기 0.1
console.log(x === y); //false
console.log(x === 0.1); //false  0.3 - 0.2는 0.1과 같지 않다
console.log(y === 0.1); //true  0.2 - 0.1 = 0.1

이러한 계산 오류를 보완하기 위해

1. .toFixed() 함수 사용

💡.toFixed() 함수는 문자열(string)로 반환되기 때문에 Number()함수 또는 '+' 연산자를 붙여서 숫자로 형변환시켜주어야 한다.

let sum = 0.1 + 0.2;
console.log(+sum.toFixed(1)); // 0.3

2. Math.round() 함수 사용

정수 계산은 소수보다 에러가 적다.
하지만 결국 마지막에 나눗셈이 들어가기 때문에 무한소수가 다시 등장할 수 있다는 단점이 있어 주의해야한다.

console.log(Math.round(sum * 10) / 10); 
console.log( (0.28 * 100 + 0.14 * 100) / 100); // 0.4200000000000001

참고하면 좋은 글

(5) BigInt( )

JavaScript가 표현할 수 있는 최대 정수 2**53-1 를 넘어가는 수에 대한 계산은 정밀도를 잃는다.

그러나 임의의 정밀도로 정수를 나타낼 수 있는 BigInt(num) 또는 숫자 + n를 사용하면 계산이 가능하다.

let maxNum = Number.MAX_SAFE_INTEGER; // 9007199254740991

console.log(maxNum + 1); // 9007199254740992
console.log(maxNum + 2); // 9007199254740992 (maxNum+1과 값이 같음)
console.log(maxNum + 1 === maxNum + 2); // true

console.log(BigInt(maxNum) + 2n); // 9007199254740993n
console.log(BigInt(maxNum) + 1n === BigInt(maxNum) + 2n); // false

BigInt은 Number와 별개의 타입이다.

console.log(typeof 1n); // bigint

console.log(1n === 1); // false
console.log(1n == 1); // true

일반적인 산술연산이 가능하다
단, 큰 정수를 표현하기 위한 데이터 타입으로, 소수 표현에는 사용할 수 없다.
따라서 소수 형태 결과가 리턴되는 연산은 소수점 아래 부분은 버려지고 정수 형태로 리턴된다.

console.log (1.5n); // SyntaxError: Invalid or unexpected token

console.log(10n / 6n); // 1n
console.log(5n / 2n); // 2n

number와 BigInt를 함께 산술연산 할 수 없다.
number와 BigInt의 비교 연산은 가능하다

console.log(1000n / 9n); // 111n
console.log(1000n / 9); // TypeError: Cannot mix BigInt and other types, use explicit conversions

let maxNum = Number.MAX_SAFE_INTEGER;
console.log(maxNum + 1 >= BigInt(maxNum) + 2n); // false
profile
React, Next.js, TypeScript 로 개발 중인 프론트엔드 개발자

0개의 댓글