CodeGym /행동 /Frontend SELF KO /실수 다루기

실수 다루기

Frontend SELF KO
레벨 37 , 레슨 0
사용 가능

1.1 실수의 반올림

실수(분수)는 영어로 floating point number라고 불러. 미국에서는 정수와 소수 부분을 나누기 위해 점을 사용해. 그래서 float라고 부르는 거야.

우리가 이미 살펴봤듯이, 실수 (float)를 정수 (int)로 변환하면 항상 아래로 반올림돼 — 소수 부분이 그냥 버려지는 거지. 하지만 경우에 따라서는 실수를 그냥 가장 가까운 정수로 반올림하거나 아예 위로 반올림해야 할 때도 있지. 그럴 때는 어떻게 할까?

이런 경우를 위해 JavaScript에는 내장 함수 round()가 있어. 이 함수는 Math 라이브러리가 만들어지기 전에 만들어진 거라 그 안에 포함되어 있지 않아. 반대로, 아래로 반올림하고 위로 반올림하는 함수는 math 라이브러리에 있어.

함수 Math.round()

함수 Math.round()는 숫자를 가장 가까운 정수로 반올림해줘:

    
      Math.round(실수)
    
  

이 함수는 전달된 실수에 가장 가까운 정수를 반환해줘.

예시:

명령어 결과
let x = Math.round(4.1); 4
let x = Math.round(4.5); 5
let x = Math.round(4.9); 5

함수 Math.ceil()

함수 Math.ceil()은 숫자를 정수로 위로 반올림해줘:

명령어 결과
let x = Math.ceil(4.1); 5
let x = Math.ceil(4.5); 5
let x = Math.ceil(4.9); 5

함수 Math.floor()

함수 Math.floor()은 숫자를 정수로 아래로 반올림해줘:

명령어 결과
let x = Math.floor(4.1); 4
let x = Math.floor(4.5); 4
let x = Math.floor(4.9); 4

이 명령어들이 어렵다면, 간단한 영어 수업이 도움될 거야:

  • math — 수학
  • round — 원/반올림하다
  • ceiling — 천장
  • floor — 바닥

1.2 부동소수점 숫자의 구조

JavaScript의 number 타입은 -1.7*10308부터 +1.7*10308까지의 값을 담을 수 있어. 이렇게 거대한 범위를 가지는 이유는 number 타입이 정수 타입과는 완전히 다른 방식으로 구성되어 있기 때문이야. number 타입의 각 변수는 두 개의 숫자를 담아: 첫 번째는 맨티사고, 두 번째는 지수야.

가령, 123456789라는 숫자가 있고, 우리는 이 숫자를 number 타입의 변수에 저장했다고 해보자. 그러면 이 숫자는 1.23456789*108의 형태로 변환되고, number 타입 내에 1.234567898이라는 숫자들이 저장될 거야. 빨간색은 "의미 있는 숫자" (맨티사)를 나타내고, 파란색은 지수를 나타내.

이 접근법은 매우 큰 숫자와 매우 작은 숫자 모두를 저장할 수 있게 해줘. 하지만 숫자의 크기가 8바이트 (64비트)로 제한되어 있고 일부 비트는 지수의 저장에 사용되기 때문에 (숫자와 지수의 부호도), 맨티사의 최대 길이는 15자리로 제한돼.

이것은 실수의 구조에 대한 매우 단순화된 설명이야: 더 포괄적인 설명은 이 링크에서 찾을 수 있어.

1.3 실수 처리 시 정확도 손실

실수를 다룰 때는 항상 실수가 정확하지 않다는 걸 염두에 둬야 해. 항상 반올림 오류, 십진수를 이진수로 변환하는 오류가 있을 거고, 가장 흔한 것으로는 너무 다른 크기를 가진 숫자를 덧셈/뺄셈할 때 정확도 손실이 발생해.

이 마지막 문제는 프로그래밍 초보자에게 가장 놀라운 상황이야.

109에서 1/109을 빼면, 다시 109이 나오게 돼.

서로 너무 다른 크기의 숫자를 뺄 때 설명
1000000000.000000000
-      0.000000001
1000000000.000000000
두 번째 숫자는 너무 작아서 그 중요한 부분이 무시돼 (회색으로 표시). 빨간색은 15개의 중요한 숫자를 표시하고 있어.

뭐라 더 말할 필요 있겠어, 프로그래밍은 수학이 아니야.

1.4 실수를 비교할 때의 위험

실수를 비교할 때 또 다른 위험이 직면하게 돼. 이 숫자들과 작업할 때 반올림 오류가 누적될 수 있어서, 실수들이 같아야 하는 상황에서도 다르게 나타날 수 있어. 반대로 숫자가 다르게 보여야 할 때 같을 수도 있어.

예시:

명령어 설명
let a = 1000000000.0
let b = 0.000000001
let c = a – b
변수 a의 값은 1000000000.0이야.
변수 c의 값도 1000000000.0이야
(b 변수의 숫자가 너무 작아서).

위 예제에서 ac는 같지 않아야 하지만, 실제로는 같아.

또 다른 예시를 들어보자:

명령어 설명
let a = 1.00000000000000001
let b = 1.00000000000000002
변수 a의 값은 1.0이야.
변수 b의 값도 1.0이야.

실무에서는 실수를 이렇게 비교해:

두 숫자의 차이 (절대값)가 특정 매우 작은 값보다 작으면, 그 숫자들은 같다고 여겨.

예시:

JavaScript
    
      let a = 0.00000000012;
      let b = 0.000000000011;

      if (Math.abs(a - b) < 0.00001) {
        console.log("같음");
      } else {
        console.log("다름");
      }
    
  
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION