JavaScript에서 부동 소수점 연산과 오차 해결 방법
JavaScript에서는 부동 소수점 연산으로 인해 정확한 결과가 나오지 않는 경우가 있습니다. 이 글에서는 이러한 오차가 발생하는 이유와 이를 해결하는 방법에 대해 알아보겠습니다.
JavaScript는 IEEE 754 표준을 따르는 64비트 부동 소수점 형식을 사용하여 소수 값을 표현합니다. 이 방식은 제한된 비트 수로 소수를 표현하기 때문에, 정확하게 표현할 수 없는 소수는 근사치로 저장됩니다. 이로 인해 부동 소수점 연산에서는 오차가 발생할 수 있습니다.
예시:
console.log(0.1 + 0.2); // 0.30000000000000004
위의 예시에서 0.1과 0.2를 더한 결과는 예상한 0.3이 아닌 0.30000000000000004입니다. 이는 0.1과 0.2가 부동 소수점 형식에서 정확하게 표현되지 않아 생기는 오차입니다.
소수점 자리 수에 따른 반올림
toFixed
메서드를 사용하여 반올림된 소수점 자리 수로 표현할 수 있습니다. 반환되는 문자열을 다시 숫자로 변환하면 원하는 자릿수로 반올림된 값을 얻을 수 있습니다.let sum = 0.1 + 0.2;
let roundedSum = Number(sum.toFixed(1));
console.log(roundedSum); // 0.3
toFixed
와 단항 +
연산자 사용
toFixed
로 반올림된 문자열을 단항 +
연산자를 사용해 숫자로 변환할 수 있습니다.let sum = 0.1 + 0.2;
let roundedSum = +sum.toFixed(1);
console.log(roundedSum); // 0.3
곱셈 및 나눗셈을 통한 반올림
let sum = 0.1 + 0.2;
let roundedSum = Math.round(sum * 10) / 10;
console.log(roundedSum); // 0.3
Number.EPSILON
사용
Number.EPSILON
은 두 부동 소수점 수 사이의 가장 작은 간격을 나타냅니다. 이 값은 근사치 비교를 할 때 유용합니다.0.1 + 0.2
를 수행하면 부동 소수점 연산으로 인해 정확한 0.3이 아닌 0.30000000000000004가 반환됩니다. 이 경우 Number.EPSILON
을 더하여 소수점 오차를 보정할 수 있습니다.원리 설명:
Number.EPSILON
은 두 숫자가 동일하지는 않지만, 매우 근접한 경우 오차를 줄이는 역할을 합니다.Math.round
로 반올림할 때 Number.EPSILON
을 더하면, 근사치를 비교하여 더 정확한 결과를 얻을 수 있습니다.예시:
let sum = 0.1 + 0.2;
let roundedSum = Math.round((sum + Number.EPSILON) * 10) / 10;
console.log(roundedSum); // 0.3
부동 소수점 연산의 오차는 컴퓨터 과학에서 흔히 발생하는 현상입니다. Number.EPSILON
을 사용하여 오차를 줄이는 등의 방법을 통해 부동 소수점 연산에서 더 정확한 결과를 얻을 수 있습니다.