본문 바로가기
Programming/자바스크립트

[자바스크립트] Number

by 코딩하는 랄로 2023. 10. 22.
반응형

Number 타입

자바스크립트의 primitive type 중 하나로, 정수와 실수 모두 Number 타입에 해당한다. 그렇기 때문에 정수이든, 실수이든 Number 타입의 변수는 항상 64bit floating point 데이터로 저장된다.

 

Number 타입을 사용할 때의 주의할 점은 정밀도(precision)이다. 정수와 실수에 따른 정밀도는 다음과 같다.

  • 정수 : 15자리까지는 정확도 유지
  • 실수 : 소수점 이하 17자리 까지 정호가도 유지
  • 실수간의 연산은 언제나 100% 정확하지 않다.

정밀도 문제에 대해서 정확히 인지하고 있어야 Number 타입의 데이터를 다룰 때 원하는 결과를 도출 할 수 있다.

 

자바스르립트에서 Number가 가질 수 있는 가장 큰 값은 1.8E308이다. 그 이상의 값은 BigInt를 사용하여야 한다.

 

 

 

Number 타입 리터럴

일반적은 Number 타입의 변수는 리터럴(literal)로 생성한다.

7; // 정수 리터럴
2.5; // 부동 소수점 리터럴
0b111; // 2진수 리터럴 (binary literal)
0o777; // 8진수 리터럴 (octal literal)
0xf5; // 16진수 리터럴 (hexademical literal)
10_000 // 숫자 구분 기호 (Numeric Separators)

2, 8, 16진수는 표기법만 다를 뿐이지, 내부적으로는 10진수 정수와 같은 형태로 다루어지기 때문에 0b111과 7은 완전 동일한 값이다.

 

숫자 구분 기호는 개발자가 숫자를 가독성있게 읽기 위한 표기법이다. 1000단위를 구분기호 _를 사용하는 방법으로 ES2021에 포함된 문법이다. 특정 브라우저에서만 사용할 수 있으므로 사용시 브라우저가 해당 버전을 지원하는지 확인하여야 한다.

 

 

Number 타입의 연산

// 산술 연산 (arithmetic operators)
1 + 2; // 더하기
3 - 4; // 빼기
5 * 6; // 곱하기
7 / 8; // 실수 나누기
14 % 3; // 나머지
2 ** 3; // 거듭제곱

// 비교 연산 (comparison operators)
1 < 2; // 작다
3 > 4; // 크다
5 <= 5; // 작거나 같다
6 >= 7; // 크거나 같다
8 === 8; // 같다
8 !== 9; // 같지 않다

// 증감 연산 (incresement/decreasement operators)
let a = 1; ++a; // 연산결과는 2, a는 2
let b = 1; b++; // 연산결과는 1, b는 2
let c = 1; --c; // 연산결과는 0, c는 0
let d = 1; d--; // 연산결과는 1, d는 0

// 복합 대입 연산
x -= 1;
x *= 2;
x /= 3;
x %= 4;
x **= 5;

 

 

 

다른 타입과의 연산

Javasciprt는 number 타입과 다른 타인간의 연산도 허용한다. 

1 + null; // null
1 * '1'; // NaN
1 + '1'; // '11'
1 - '1'; // 0
100 / "10"; // NaN
100 / "Apple"; // NaN

피연산자로 어떤 타입이 오는지, 또는 어떤 연산자를 사용하는 지에 따라 결과값의 타입이 달라지는 것을 볼 알 수 있다. 이렇게 일관적이지 않은 연산을 사용한 코드는, 코드의 이해를 어렵게 하기 때문에 좋지 않은 코드로 평가된다. 그렇기 때문에, Number타입과 다른 타입과의 연산은 웬만하면 피하는 것을 권장한다.

 

 

NaN (Not a Number) / Infinity

NaN는 Not a Number의 약자로, 계산 불가능한 연산의 결과값을 나타내기 위해 사용되는 값이다. NaN의 타입은 Number이고 falsy값(boolean 변환시 false)이다.

 

또한 Nat은 자바스크립트의 값들 중 유일하게 자기자신과 같지 않은 값이다. 따라서 어떤 값이 NaN인지 판별하기 위해서는 일반적인 비교연산자를 사용하면 안되고, Number.isNaN 또는 Object.is함수를 사용해야 한다.

const isNaN = NaN;

//일반적인 비교 연산자 사용X
isNaN === NaN; // false

//올바른 비교법
Number.isNaN(isNaN); //true
Object.is(isNaN, NaN); //true

 

Infinity는 자바스크립트가 무한대를 나타내기 위해 내장하고 있는 number 타입의 값이다.

//Infinity 내장 값 사용
1 / Infinity;  // 0
1 / -Infinity; // -0

//Number의 프로퍼티 사용
Number.POSITIVE_INFINITY;
Number.NEGATIVE_INFINITY;

 

어떤 값이 Infinity인지 확인하기 위해서는 Number.isFinite를 사용하면 된다.

Number.isFinite(1); // true
Number.isFinite(Infinity); // false
Number.isFinite('1'); // false
isFinite('1'); // true - `isFinite`는 문자열을 숫자로 변환

 

 

 

Number는 원시 타입? 객체 타입?

일반적인 프로그래밍 언어에서는 숫자와 관련된 타입은 원시 타입으로 분류된다. 자바스크립트에서도 Number 타입은 원시 타입이다.

 

하지만 자바스크립트에서는 모든 데이터가 내부적으로 object로 다루어지기 때문에 객체 타입의 특징도 가지게 되기 때문에 property나 method 사용이 가능하다.

 

 

 

Number 메소드

유용하게 사용할 수 있는 메소드에 대해서 알아보겠다.

 

Number 타입으로 변환하는 메소드

/*
* number 로 변환하는 방법 3가지
* 
*  Number() '함수'
*  parseInt()
*  parseFloat()
* 
*  다양한 경우에서 사용자가 입력한 값은 문자열(string) 타입으로 입력된다
* 이의 산술연산을 하거나 Number 메소드를 적용하려면 number로 변환해야 한다
*/
//Number
console.log(Number("10")); // 10
console.log(Number("   10   ")); //10
console.log(Number(true)) //1
 
//parseInt(). parseFloat()
console.log(parseInt("-10"));
console.log(parseInt("110" , 2)); //문자열을 2진수로 간주하여 반환 => 6
console.log(parseInt("-10.33"));
console.log(parseInt("10 20 30"));  // 10
console.log(parseInt("10 years"));  // 10
console.log(parseInt("years 10"));  // NaN
console.log(parseFloat("-10.33"));

 

실수인지 정수인지 판별

// Number.isInteger 
// Number 객체의 static 메소드
//-> true : 정수 / false : 실수
console.log(Number.isInteger(3));
console.log(Number.isInteger(3.0));
console.log(Number.isInteger(3.1));

 

그 외

// toString(radix)
// radix진법으로 변환
let num = 76;
console.log(num.toString());  // "76"
console.log(num.toString(2));
console.log(num.toString(8));
console.log(num.toString(16));

// toFixed(n)
// 소수점 이하 n자리 까지 표현한 문자열 리턴(이하 반올림)
num = Math.PI;

console.log(num);
console.log(num.toFixed(2));  // "3.14"
console.log(num.toFixed(3));  // "3.142"

// toExponential()
// 숫자를 지수 표기법으로 표기해 반환
num = 123456;
console.log(num);
console.log(num.toExponential());
console.log(num.toExponential(2));

// toPrecision(n)
// Number 객체를 지정된 정밀도로 나타내는 문자열을 반환
// n은 유효 자릿수
num = 123.456;
console.log(num);
console.log(num.toPrecision(4));
console.log(num.toPrecision(8));
반응형