[JavaScript] 2-2. JavaScript Number Type

JavaScript Number Type


숫자 타입 리터럴 (Number Type Literal)

7; //  정수 리터럴
3.7; //  부동 소수점 리터럴
0b111; //  2진수 리터럴 - ES6에서 숫자앞에 0b를 붙이면 JS엔진이 2진수로 처리
0o123; //  8진수 리터럴 - ES6에서 숫자앞에 0o을 붙이면 JS엔진이 8진수로 처리
0xf4; //  16진수 리터럴 - ES5부터 있었으며, 숫자앞에 0x를 붙이면 JS엔진이 16진수로 처리

2,8,16 진수의 리터럴은 표기법일 뿐, 내부적으로는 10 진수 정수와 같은 형태입니다.

0xff == 255; // true
0o377 == 255; // true

number type 을 확인해 보기 위해서는 앞시간에 공부한 typeof 연산을 해보면 됩니다.

typeof 13884284; // 'number'



정수와 실수를 구별하는 방법, Number.isInteger(number)

JavaScript 의 number type 은 정수와 실수를 별도로 구분하지 않습니다.
어떤 수가 정수인지 실수인지 확인하기 위해서는 Number.isInteger()를 사용합니다.
여기서 정수는 간단하게 소수 부분이 없는 수, 실수는 소수 부분이 있는 수이며,
만약 number 부분에 소수가 없다면 true 가 반환되고 소수가 있다면 false 가 반환됩니다.

Number.isInteger(-18); > true
Number.isInteger(33); > true
Number.isInteger(3.3); > false
Number.isInteger(-4.2); > false
Number.isInteger('3'); > false  //  문자열도 false 반환
Number.isInteger(NaN); > false  //  NaN도 false 반환
Number.isInteger(Infinity); > false //  Infinity도 false 반환

/*
즉, Number.isInteger(Number) 자체가 숫자에게 정수냐고 물어보기 때문에
정수가 아닌 다른 값(실수,문자열,불린값등..)들은 모두 false가 반환된다.
*/



숫자 타입 연산 (Number Type Operater)

// 산술 연산
3 + 3; //  더하기 (6)
3 - 2; //  빼기 (1)
5 * 6; //  곱하기 (30)
8 / 2; //  나누기 (4)
12 % 2; //  나머지 (0)
2 ** 4; //  거듭제곱 (16)

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

// 증가/감소 연산
let f = 1;
++f; // 연산결과는 2, f는 2 : ++변수 연산자는 연산 전에 변수의 값을 증가시킴
let d = 1;
d++; // 연산결과는 2, d는 1 : 변수++ 연산자는 연산 후에 변수의 값을 증가시킴
let s = 2;
--s; // 연산결과는 1, s는 1 : --변수 연산자는 연산 전에 변수의 값을 감소시킴
let f = 2;
s--; // 연산결과는 1, s는 2 : 변수-- 연산자는 연산 후에 변수의 값을 감소시킴

// 할당 연산
let fds = 1; //  변수 fds에 1이라는 값을 할당
fds = +1; //  변수 fds에 1을 더한 후 다시 fds에 값을 할당하기 (결과는 2)
// (fds =+ 1;)은 (fds = fds+1;)와 같습니다.

// 덧셈뿐 아니라 할당 연산은 모든 산술 연산자가 가능합니다.



연산자 우선순위 (Operator Precedence)

한 구문에 여러 개의 연산자를 이어서 쓴 경우, 연산자 우선 순위에 의해 계산됩니다.
수학시간에 배운 연산 우선순위와 같습니다.

let a = 2 + 2 * 2; // 6
let b = (2 + 2) * 2; //  8



부동 소수점 (Floating Point), 고정 소수점(Fixed Point)

console.log(0.1 + 0.2); //      ?

연산을 해보기 전에는 보통 대부분의 사람들이 0.3 이라는 답을 예상합니다.
실제로 연산을 해보면 0.30000000000000004 라는 답이 나옵니다.
결론부터 말씀드리면 IEEE 754 표준 중 배정도 부동소수점을 사용하여,
계산된 정밀도를 맞추기 위해 나머지 수를 반올림하여 표현하였기 때문입니다.
그럼 IEEE 754 를 안쓰면 되지않냐고 생각하시겠지만 IEEE 754 는 컴퓨터에서
소수를 표현하는 방식으로 널리 사용되고 있으며, 많은 티그래밍 언어들이 표준을 따릅니다.
그럼 IEEE 754 에서 오차를 왜 그냥 두는지 의아해 하실 수 있는데
이는 계산 상의 효율성을 위한 것입니다.
컴퓨터의 저장 공간은 한정적이고, 내부적으로는 0 과 1 만 다룰 수 있으므로,
이런 제약안에서 10 진수 소수를 빠르게 계산하기위해 이렇게 개발되어 진 것입니다.

만약 나는 죽어도 0.1+0.2 에 대한 값으로 0.3 을 얻고 싶다고 하시면 다음과 같이 하시면 됩니다.

/* toFixed() 메소드를 사용합니다.
toFixed()는 지수 표기법을 사용하지 않고, 소수점 뒤에 정확한 자리수를 가지는 숫자 객체의
문자열을 리턴합니다. 필요한 경우에 숫자는 반올림이 되고, 소수 부분에는 필요에 따라서
0이 채워져 지정된 길이가 됩니다. */

(0.1 + 0.2).toFixed(1);
// 파라미터로 넣은 1은 소수점 1번째까지 표시하라는 의미로 1을 하였습니다.
// 소수점 2자리까지 표시하고 싶으면 2를 넣으면 됩니다.
// 표시하고 싶지않으면 0을 넣으면 됩니다.



Number Type : NaN, -0, Infinity, -Infinity



ParseInt, ParseFloat

문자열을 number 타입으로 바꾸기 위해 parseInt(정수), parseFloat(실수) 메소드를 사용합니다.

parseInt(123); //  123
parseInt(12.33); // 12
parseInt(111, 2); // 7 (2진수로 변환하여 계산)
parseInt("hi"); // NaN
parseFloat(123); //  123
parseFloat(12.33); // 12.33

Number()라는 String(문자열)을 숫자로 형변형시키는 메소드도 있지만,
무조건 숫자로만 이루어져야 정상적으로 리턴할 뿐더러, 소수점을 포함하는 숫자나 문자열을 정수로
변환시키기에 parseInt 와 parseFloat 를 사용하는 것이 좋습니다.



다른 타입과의 연산

JS 에서는 다른 타입과의 연산도 허용하지만, 결과가 좋지 않습니다.
피연산자로 어떠한 값이 오느냐에 따라 결과 값이 달리지는등.. 일관적이지 않은 결과를 보여줍니다.

논리갑(?) 자바스크립트의 예를 보여주는 짤방..

이처럼 JS 에서는 Number 를 포함하여 가급적 같은 타입의 연산을 하는 것이 좋습니다.
특히 수연산을 하기위해서는 모든 피연산자를 number 타입으로 확실히 만들어 주는 것이 좋습니다.



Math 객체

// 삼각함수, 로그함수, 지수함수
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.sum;
Math.hypot;

// 랜덤
Math.random;

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

// 부호 반환
Math.sign;

위의 메소드와 Number 타입의 데이터를 이용하여 여러가지 기능을 만들수 있습니다.

//간단하게 Math.random과 Math.ceil을 이용하여 만든 lotto 로직

var temp = [];

function lotto() {
  for (var i = 0; i < 6; i++) {
    temp[i] = Math.ceil(Math.random() * 44);
    for (var j = 0; j < i; j++) {
      if (temp[i] == temp[j]) {
        console.log(temp[i], temp[j]);
        i--;
        break;
      }
    }
  }
  return temp.sort(function(a, b) {
    return a - b;
  });
}

function ex() {
  document.write(lotto());
}



2. Today I Found Out

예전에 JavaScript를 취미로 공부했었던 적이 있는데 그때(5.5)에 비해 메소드도 많이 생기고,
데이터 연산시 어떻게 하는게 좋다는 자바스크립트 가이드까지 있어서 공부하면서
점점 더 추가가 되고 있고, 문제가 있는 부분은 보완이 되감을 느끼면서
자바스크립트가 점차 능력이 좋아지고 있다는 것을 조금이라도 느낄 수 있었습니다.
계속 꾸준히 흥미잃지 않고 공부해나가도록 하겠습니다.



3. refer

https://helloworldjavascript.net

http://programmingsummaries.tistory.com/355

http://gafani.tistory.com/entry/Javascript-%EC%86%8C%EC%88%98%EC%A0%90-%EC%9E%90%EB%A6%AC%EC%88%98-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0

http://javaweb75.blogspot.kr/2018/01/javascript.html