본문 바로가기

언어/JavaScript

[ Javascript ] 수동 소수점 반올림 오류와 대책 알아보기

반응형

 

 

 

 

자바스크립트에서 부동소수점(floating-point) 반올림 오류는 IEEE 754 표준에 따라 실수를 이진수로 표현하는 방식 때문에 발생합니다. 이로 인해 일부 십진수를 정확하게 이진수로 표현할 수 없어서 계산 시 오차가 발생하게 됩니다.


1. 부동소수점 반올림 오류 설명

컴퓨터는 숫자를 이진수로 저장합니다. 하지만 0.1이나 0.2 같은 간단한 십진수조차도 이진수로 정확히 표현할 수 없습니다. 이 때문에 결과적으로 계산 시 작은 오차가 누적되거나 예상치 못한 값이 출력됩니다.


2. 오류가 발생하는 예제

console.log(0.1 + 0.2); // 예상: 0.3, 실제: 0.30000000000000004
console.log(0.1 + 0.7); // 예상: 0.8, 실제: 0.7999999999999999
console.log(0.3 === 0.1 + 0.2); // false

3. 오류가 발생하지 않는 분수의 예제

2의 거듭제곱으로 정확히 표현 가능한 숫자는 오차 없이 처리됩니다.

console.log(0.5 + 0.25); // 0.75 (정확함)
console.log(0.125 + 0.375); // 0.5 (정확함)
console.log(0.5 === 0.25 + 0.25); // true

예) 0.5 (1/2), 0.25 (1/4), 0.125 (1/8) 등은 이진수로 정확히 표현 가능


4. 부동소수점 오류를 피하는 방법

 

1) 소수점 자리수 반올림

Number.toFixed() 또는 Math.round() 등을 사용하여 자릿수를 강제로 제한

let sum = 0.1 + 0.2;
console.log(Number(sum.toFixed(2))); // 0.3

2) 정수로 변환 후 계산

모든 계산을 정수로 바꾸고, 마지막에 나눔

let a = 0.1 * 10;
let b = 0.2 * 10;
let result = (a + b) / 10;
console.log(result); // 0.3

3) 오차 허용 비교

정확한 비교 대신 epsilon 범위를 허용

function isEqual(a, b, epsilon = Number.EPSILON) {
  return Math.abs(a - b) < epsilon;
}

console.log(isEqual(0.1 + 0.2, 0.3)); // true

5. 정리

방법 설명 예시
.toFixed() 자리수 반올림 sum.toFixed(2)
정수 변환 정수로 변환 후 다시 나눔 (a + b) / 10
오차 허용 EPSILON 비교 Math.abs(a - b) < EPSILON

 

 

 

 

반응형