JavaScript에서 부동 소수점 연산과 오차 해결 방법

BossTeemo·2024년 5월 6일
0
post-thumbnail

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가 부동 소수점 형식에서 정확하게 표현되지 않아 생기는 오차입니다.

부동 소수점 연산의 오차 해결 방법

  1. 소수점 자리 수에 따른 반올림

    • toFixed 메서드를 사용하여 반올림된 소수점 자리 수로 표현할 수 있습니다. 반환되는 문자열을 다시 숫자로 변환하면 원하는 자릿수로 반올림된 값을 얻을 수 있습니다.
    let sum = 0.1 + 0.2;
    let roundedSum = Number(sum.toFixed(1));
    console.log(roundedSum); // 0.3
  2. toFixed와 단항 + 연산자 사용

    • toFixed로 반올림된 문자열을 단항 + 연산자를 사용해 숫자로 변환할 수 있습니다.
    let sum = 0.1 + 0.2;
    let roundedSum = +sum.toFixed(1);
    console.log(roundedSum); // 0.3
  3. 곱셈 및 나눗셈을 통한 반올림

    • 부동 소수점 연산에서 정수 연산이 더 정확하므로, 계산 전 수를 10이나 100 같은 정수로 곱한 뒤에 반올림하여 정수로 만든 후 다시 나눕니다. 이를 통해 더 정확한 값을 얻을 수 있습니다.
    let sum = 0.1 + 0.2;
    let roundedSum = Math.round(sum * 10) / 10;
    console.log(roundedSum); // 0.3
  4. Number.EPSILON 사용

    • Number.EPSILON은 두 부동 소수점 수 사이의 가장 작은 간격을 나타냅니다. 이 값은 근사치 비교를 할 때 유용합니다.
    • 예를 들어, 0.1 + 0.2를 수행하면 부동 소수점 연산으로 인해 정확한 0.3이 아닌 0.30000000000000004가 반환됩니다. 이 경우 Number.EPSILON을 더하여 소수점 오차를 보정할 수 있습니다.

    원리 설명:

    • Number.EPSILON은 두 숫자가 동일하지는 않지만, 매우 근접한 경우 오차를 줄이는 역할을 합니다.
    • 예를 들어, 0.1과 0.2를 더한 결과를 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을 사용하여 오차를 줄이는 등의 방법을 통해 부동 소수점 연산에서 더 정확한 결과를 얻을 수 있습니다.

profile
1인개발자가 되겠다

0개의 댓글