JAVASCRIPT

number 타입

걍가영 2019. 3. 19. 19:54

number 타입

number 타임 리터럴

7; // 정수 리터럴
2.5; // 부동 소수점 리터럴
0b111; // 2진수 리터럴
0o777; 8진수 리터럴
0xf9; // 16진수 리터럴

Number.isInteger

정수인지 실수인지 판단하는 메소드

Number.isInteger(1) // true
Number.isInteger(0.1) // false

사칙연산

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

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

// 증가/감소 연산
let a = 1; ++a; // a = 2
let b = 1; b++; // b = 2
let c = 1; --c; // c = 0
let d = 1; d--; d = 0

// 할당 연산
//x에 1을 더한 후 다시 x에 할당하기. x=1
let x = 0;
x += 1;
//+= 연산은 아래와 같이 동작합니다.  
x = x+1; // 2

// 모든 산술 연산자에 대해 할당 연산 가능
x -= 1;
x *= 2;
x /= 3;
x %= 4;
x ** = 5;

연산자 우선순위

한 구문에 여러 개의 연산자를 쓴 경우, 연산자 우선순위에 의해 결정됨
연산자 우선순위 링크.

3 + 4 \* 5; // 23

부동 소수점과 고정소수점

컴퓨터는 소수를 2진수를 이용해 저장하기 때문에, 하단의 예제처럼 10진수 소수를 정확히 다룰 수 없으며,
이것을 반올림 오차라고 함

0.1 + 0.2; //0.30000000000000004

number 타입의 특이한 값

  • NaN
  • -0
  • Infinity
  • Infinity

NaN

계산 불가능한 연산의 결과값을 나타내기 위해 사용

0 / 0; // NaN
1 * 'hi'; // NaN

Number.isNaN, Object.is

NaN 은 자기 자신과 같지 않은 값이므로, 판별하기 위해서는 함수를 사용해야 함

const isNan = NaN;
Numver.isNaN(isNan); // true
Object.is(isNan, NaN); // true

-0

0과 -0은 다른 값이지만, 비교 연산을 하면 true로 나옴

0 === -0; // true
1 \* -0; // -0
1 + -0 // 1
//Object.is 사용할 경우 0 과 -0은 다른 값을 취급
Object.is(0, -0); // false
// 0이 아닌 어떤 수를 0 혹은 -0으로 나눌 때에도 결과값이 다름
1 / 0; // Infinity
1 / -0; // Infinity

Infinity

무한대를 나타내기 위한 값인 Infinity를 내장하고 있음

1 / Infinity; // 0
1 / -Infinity; // -0

Number.isFinite

Infinity 판별하기 위해 사용되는 메소드

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

parselnt, parseFloat

문자열을 number 타임으로 바꾸기 위해 parselnt 또는 parseFloat 함수를 사용할 수 있음

parselnt('123'); // 123
parselnt('111', 2); // 6 (문자열 2진수로 간주합니다.)
parseFloat('12.345'); // 12.345
parselnt('hi') // NaN

다른 타입과 연산

number 타입과 다른 타입 간의 연산도 허용하지만, 그 결과는 일관적이지 않으므로 비추천

특히 promt 나 input 태그 등을 통해 사용자로부터 입력받은 데이터는 undefined 혹은 문자열일 가능성이 높음.
이런 경우는 수 연산을 하기전에 모든 피연산자를 확실히 number 타입으로 만들어주는 것이 좋음

const input = prompt('정수를 입력하기');
const num = parseInt(input);

if (Number.isNaN(num)) {
    alert('정수가 아니다');
}else {
    const result = num \* 2;
    alert(`${num}의 두 배는 ${result} 입니다.`);
}

Math 객체

// 상수
Math.E //  자연상수 (2.71...)
Math.PI // 원주율 (3.14...)

// 삼각함수, 로그함수, 지수함수
Math.sin // 사인
Math.cos // 코사인
Math.tan // 탄젠트
Math.log //  밑을 자연상수로 하는 로그함수
Math.exp // 밑을 자연상수로 하는 지수함수
Math.sqrt // 제곱근


// 절대값, 올림, 내림, 반올림, 소수점 아래 잘라내기
Math.abs // 절댓값
Math.ceil // 올림
Math.floor // 내림
Math.round  // 반올림
Math.trunc // 소수점 아래 잘라내기

// 최대값, 최소값
Math.max 
Math.min

//랜덤
Math.random
Math.cos(Math.PI); // -1
Math.log(Math.E); // 1
Math.round(0.5); // 1
Math.random(); // 0 과 1 사이의 값이 임의로 반환됩니다.
Math.max(1, 2, 3, 4, 5); // 5