[모던 JavaScript 튜토리얼] 21. 숫자형
자바스크립트에서 숫자를 표현하는 방법은 두 가지다.
- 64비트 형식의 일반적인 숫자.
- 64비트를 넘어가는 범위의 숫자는 BigInt라는 원시값을 통해 표현한다.
숫자를 입력하는 다양한 방법
let billion = 1000000000;
console.log(billion); // 10억 (1,000,000,000)
위 코드는 변수에 10억을 담아 출력하는 간단한 예제다. 위처럼 0을 9번 작성하다보면, 실수를 범할 수 있다.
let billion = 1e9; // 10억, 1과 9개의 0
console.log(billion); // 10억 (1,000,000,000)
console.log(7.3e9); // 73억 (7,300,000,000)
자바스크립트도 위와 같이 지수 표기법을 제공한다. 위처럼 작성하면 보다 명시적이다.
16진수, 2진수, 8진수
let hexa = 0xff;
let binary = 0b11;
let octal = 0o10;
console.log(hexa); // 255
console.log(binary); // 3
console.log(octal); // 8
16진수는 0x, 2진수는 0b, 8진수는 0o를 통해 표현할 수 있다.
toString(base)
let num = 255;
console.log( num.toString(16) ); // ff
console.log( num.toString(2) ); // 11111111
num.toString(base)
메서드는 base 진법으로 num 을 표현한 후, 이를 문자형으로 변환해 리턴한다.
// let num = 255;
console.log( 255..toString(16) ); // ff
console.log( 255..toString(2) ); // 11111111
숫자로 직접 메서드를 호출하고 싶으면 위와 같이 두 개의 점을 이용해 메서드를 접근해야 한다.
어림수 구하기
- Math.floor : 소수점 첫째 자리에서 내림.
- Math.ceil : 소수점 첫째 자리에서 올림.
- Math.round : 소수점 첫째 자리에서 반올림.
- Math.trunc : 소수부를 싹 버림. 정수로 변환되는 효과가 있다.
let num = 12.34;
let converted = num.toFixed(1);
console.log(converted); // 12.3
console.log(typeof converted) // string
특정 소수점까지 남기고 싶을 땐 toFixed 메서드
를 사용한다. 파라미터로 전달된 수의 다음 자릿수에서 반올림하는 효과가 있다. 반환된 값이 문자열이라는 것을 주의하자. 결과를 단항 덧셈 연산자(+)나 Number() 를 이용해 숫자형으로 가공하자.
부정확한 계산
자바스크립트에서 숫자는 64비트로 표현된다. 이 중 52비트가 실질적인 숫자 표현에 사용되고, 11비트는 소수점 위치를, 1비트는 부호를 저장하는 데 사용된다.
console.log(1e500) // Infinity
64비트로 감당안되는 숫자는 Infinity
로 처리된다.
console.log(0.1 + 0.2 === 0.3); // false
console.log(0.1 + 0.2); // 0.30000000000000004
위처럼 정밀도 손실(loss of precision)에 의해 예상과 다른 결과가 나오기도 한다. 숫자는 컴퓨터상에서 2진수로 표현되기 때문에, 0.1을 정확하게 저장하는 방법은 없다. 실수를 이진 부동소수점으로 처리하는 IEEE-754 규칙에 의해 발생한 오차라고 보면 될 것 같다.
isNaN, isFinite
console.log(isNaN("123")); // false
console.log(isNaN("str")); // true
console.log(isNaN(NaN)); // true
console.log(NaN === NaN); // false
isNaN(value)
는 인수를 숫자로 변환한 뒤, 변환된 숫자가 NaN인 경우 true를 반환한다.
맨 아래 예시와 같이, NaN은 자기 자신을 포함해 그 어떤 값과도 같지 않다는 특수한 성질을 가지므로, NaN 판별은 반드시 isNaN 메서드
로 해야한다는 점을 주의하자.
console.log(isFinite("15")); // true
console.log(isFinite("str")); // false
console.log(isFinite(Infinity)); // false
console.log(isFinite("")); // true
isFinite(value)
는 인수를 숫자로 변환한 뒤, 변환된 숫자가 NaN, Infinity, -Infinity 가 아닌 일반 숫자의 경우 true를 반환한다.
맨 아래 예시와 같이, 빈 문자열은 숫자와 관련된 모든 내장 함수에서 0으로 취급된다는 점을 주의하자.
Object.is
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true
console.log(0 === -0); // true
console.log(Object.is(0, -0)); // false
Object.is
는 동등 연산자( === )처럼 값을 비교할 때 사용되는 특별한 내장 메서드다. 위의 두 경우를 제외한 모든 경우에서 Object.is 는 동등 연산자와 같은 결과를 보여준다.
parseInt, parseFloat
console.log(parseInt("100px")); // 100
console.log(parseInt("12.3")); // 12
console.log(parseFloat("12.5em")); // 12.5
console.log(parseFloat("12.3.4")); // 12.3
parseInt
와 parseFloat
는 문자열 맨 처음부터 숫자를 읽을 수 없을 때까지 읽어 그 값을 반환한다.
console.log(parseInt("0xff", 16)); // 255
console.log(parseInt("ff", 16)); // 255
console.log(parseInt("0b1010", 2)); // 0
console.log(parseInt("1010", 2)); // 2
parseInt
의 경우, 두 번째 파라미터로 진법 base 를 줄 수 있다. 해당 진수로 숫자를 변환해 리턴한다.
위 예시의 경우, 2진수 “0b1010” 을 파싱할 때에는 0을 읽고 다음 문자 b를 읽지 못해 에러를 발생시키고 0을 리턴하는 반면, 16진수 “0xff” 를 파싱할 때에는 0을 리턴하지 않는 예외적인 모습을 볼 수 있다. 16진수는 알파벳 표현이 가능하므로, 모든 알파벳을 읽어야 하기 때문이라고 생각한다..
기타 유용한 Math 메서드
- Math.random() : 0과 1 사이의 난수를 반환한다.
- Math.max(a, b, c …) / Math.min(a, b, c …) : 인수 중 최대 혹은 최소 값을 반환한다.
- Math.pow(n, power) : n을 power 번 거듭제곱 한 결과 값을 반환한다.
댓글남기기