반응형
자바스크립트에서 부동소수점(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 |
반응형
'언어 > JavaScript' 카테고리의 다른 글
[ Javascript ] 날짜, timestamp 사용하기 (0) | 2025.04.12 |
---|---|
[ Javascript ] Math 객체를 사용해서 연산하기 (0) | 2025.04.11 |
[ Javascript ] 함수에 대해서 알아보기 (0) | 2025.04.08 |
[ Javascript ] 템플릿 리터럴 (0) | 2025.04.04 |
[ Javascript ] 자바스크립트 문자열에 대해서 알아보기 (0) | 2025.04.04 |