[모던 JavaScript 튜토리얼] - [5.2] 숫자형 (number)

IRISH·2024년 1월 30일
0

JS

목록 보기
50/80


학습 내용

0이 많이 붙은 큰 숫자는 다음과 같은 방법을 사용해 씁니다.

  • 0의 개수를 'e' 뒤에 추가합니다. 123e6은 0이 6개인 숫자, 123000000을 나타냅니다.
  • 'e' 다음에 음수가 오면, 음수의 절댓값 만큼 10을 거듭제곱한 숫자로 주어진 숫자를 나눕니다. 123e-6은 0.000123을 나타냅니다.

다양한 진법을 사용할 수도 있습니다.

  • 자바스크립트는 특별한 변환 없이 16진수(0x), 8진수(0o), 2진수(0b)를 바로 사용할 수 있게 지원합니다.
  • parseInt(str, base)를 사용하면 str을 base진수로 바꿔줍니다(단, 2 ≤ base ≤ 36).
  • num.toString(base)는 숫자를 base진수로 바꾸고, 이를 문자열 형태로 반환합니다.

12pt나 100px과 같은 값을 숫자로 변환하는 것도 가능합니다.

  • parseInt/parseFloat를 사용하면 문자열에서 숫자만 읽고, 읽은 숫자를 에러가 발생하기 전에 반환해주는 ‘약한’ 형 변환을 사용할 수 있습니다.

소수를 처리하는 데 쓰이는 메서드는 다음과 같습니다.

  • Math.floorMath.ceilMath.truncMath.roundnum.toFixed(precision)를 사용하면 어림수를 구할 수 있습니다.
  • 소수를 다룰 땐 정밀도 손실에 주의하세요.

이 외에도 다양한 수학 함수가 있습니다.

  • 수학 연산이 필요할 때 Math 객체를 찾아보세요. 작은 객체이지만 기본적인 연산은 대부분 다룰 수 있습니다.

요약

  1. 일반적인 숫자(-2^53 ~ 2^53)의 경우, 64비트 형식의 IEEE-754(부동소수점 표현 표준)에 저장된다.

  2. 숫자를 입력하는 다양한 방법

  • 직접입력 : 10000000, 0.000001
  • e표기 : 1e7, 1e-6
  • 16진수 : 0xff, 0xFF (대소문자 구분없음)
  • 8진수 : 0o377
  • 2진수 : 0b11111111
  1. number.toString(base) : base진법으로 number를 변환(String 반환) * base 최대값은 36이다.

  2. 숫자 메서드 호출시 .을 두 개 사용해야 소수점과 헷갈리지 않는다. * 123456..toString(36)

  3. 어림수를 구하는 다양한 방법

  • Math.floor : 소수점 첫째 자리에서 내림(버림)
  • Math.ceil : 소수점 첫째 자리에서 올림
  • Math.round : 소수점 첫째 자리에서 반올림
  • Math.trunc : 소수점 무시(절삭)
  1. 숫자형은 IEEE-754로 기록되기 때문에 부정확하게 계산될 수 있다.(정밀도 손실, loss of precision)

ex) alert( 0.1 + 0.2 == 0.3 ); // false

  • 이진법으로 각 숫자를 나타낼 경우, 무한소수가 되기 때문에 64비트로 나타내는 IEEE-754에서는 절삭이 발생하여 정밀도 손실이 발생할 수 있다.
  1. 자바스크립에서는 0에서도 부호비트가 유효하기 때문에 -0과 0이 둘 다 존재한다.

  2. Infinity : 그 어떤 숫자보다 크거나 작은값

  3. NaN(Not a Number) : 에러를 나타내는 값

  • isNaN을 통하여 확인할 수 있다. 직접 NaN과 비교는 불가능하다. 왜냐하면 NaN은 자기자신 조차도 비교할 시 false가 나오기 때문임.
  1. isFinite(value) : value가 숫자인지 검증하는 메소드 * 빈문자열, 공백만 있는 문자열은 0으로 취급됨

  2. 비교결과가 정확해야하는 경우,

Object.is

를 사용한다.

Object.is

(NaN, NaN) // true

Object.is

(0, -0) // false

  • NaN === NaN // false
  • 0 === -0 // true
  • 위의 두가지 경우를 제외하고는 ===과

object.is

는 동일한 결과를 출력한다.

  1. 연산자 + 와 Number()를 사용하여 숫자형으로 변환할 때는 피 연산자가 숫자형식이 아니면 NaN를 밷는다.

  2. 이럴때 parseInt나 parseFloat을 사용하면 효율적으로 변환이 가능하다.

  • 해당 메소드는 숫자를 읽는 도중 오류가 발생하면(특수문자나, 숫자형이 아닌 문자열을 만나면) 지금까지 읽은 정수, 혹은 부동소수점 숫자를 반환한다.
  • 읽은 숫자가 없었을 경우, NaN을 반환한다.
  • parseInt(str, radix) : parseInt를 사용할 때 radix를 통해서 N진수를 정수로 변환해줄 수 있다. * 동일하게 radix 최대값은 36이다.
  1. 기타 수학함수
  • Math.random() : 0<= n < 1 / 0과 1사이의 난수를 반환한다. 1 제외
  • Math.max(a, b, c...) / Math.min(a, b, c...) : 주어진 인수중 최대/최소값을 반환한다.
  • Math.pow(n, power) : n을 거듭제곱한 값을 반환한다.

실습

복습 목록

/* toString(base) - 아래 둘 중에 한 가지 방법으로 사용 */
console.log( 999999..toString(36) ); // lflr
console.log( (999999).toString(36) ); // lflr

//////////////////////////////////////////

let num = 1.23456;
console.log( num.toFixed(2) ); // 1.23

과제

⇒ 1번

let num1 = +prompt("수를 입력하세요");       // 13 입력
alert(typeof num1);                         // number

let num2 = prompt("수를 입력하세요"); // 123 입력
alert(typeof num2); // string

let num3 = +prompt("수를 입력하세요"); // 14 입력
alert(typeof num3); // number

alert(num1 + num3); // 27 출력
alert(num1 + num2); // "13123" 출력

⇒ 2번

// 2-1
let i = 0;
while (i != 10) {
  i += 0.2; 
}

// -----------------------------------------------

// 2-2
let i = 0;
while (i < 11) {
  i += 0.2;
  if (i > 9.8 && i < 10.2) console.log( i ); // 9.999999999999996 10.199999999999996
}
  • 2-1은 무한 루프 발생
    • 이유 : 정밀도 손실

느낀점

다른 것도 중요하지만, 이번 목차를 배우면서 가장 인상 깊었던 것은 정밀도 손실이다. 우리가 생각하는 정수 + 정수도 잘못하면 정밀도 손실로 인해 생각했던 것과는 다른 결과를 얻을 수도 있다는 것에 적지 않은 충격을 받았다.

하물며, 계산에 소수를 포함한 다양한 수를 만나면 더욱 큰 정밀도 손실로 인한 에러를 얻을 수도 있을 것이다.

나중에 계산과 관련된 프로그래밍을 할 때 생각지 못한 결과를 얻게 된다면, 프로그래밍을 잘못했다기 보다는 정밀도 손실로 인한 결과임을 깨닫고, 해결하는 내가 되길 바란다.

profile
#Software Engineer #IRISH

0개의 댓글