원인
컴퓨터에서 계산을 할 때는 10진수 대신에 0과 1만을 사용하는 2진수로 계산합니다.
- 0과 1만을 사용하여 계산하기에 10 진수를 2진수로 바꾸는 변환과정이 필요합니다.
- 이때 컴퓨터 메모리에 존재하는 한계로 인해서 연산 중 발생한 무한소수의 중간을 잘라서 유한 소수로 저장해 버립니다.
- 이 과정에서 미세한 오차가 발생하는 것입니다.
첫 번째 방법
Number((0.2 + 0.4).toFixed(1))
// 0.6
Math.round((0.2 + 0.4) * 10) / 10;
// 0.6
- Number.toFixed(n) → 소수점 n자리까지 반올림
- Math.round((a + b) * 10) / 10 → 소수점 첫째 자리까지 반올림
toFixed() 메서드는 문자열로 반환되기에 Number로 감싸서 숫자형으로 바꿔줍니다.
두 번째 방법
(0.2 * 10 + 0.4 * 10) / 10;
// 0.6
10의 거듭제곱을 곱해서 소수를 정수로 만들어 계산 후, 다시 나눠주는 방법입니다.
소수점 연산에 문제가 있으니 정수로 만들어 계산해 주는 방법입니다.
코드
// 1. toFxied 사용
function decimalPlus(a, b, n = 1) {
return Number((a + b).toFixed(n));
}
// 2. 정수로 계산
function decimalPlus(a, b, n = 1) {
const unit = Math.pow(10, n);
return (a * unit + b * unit) / unit;
}
decimalPlus(0.02, 0.04, 2);
// 0.06
위에서 소개한 방법으로 다음과 같이 함수로 제작하여 사용할 수 있습니다.
참고자료
https://joonpyo-hong.tistory.com/entry/JS-소수점-계산-오류-해결하는-법-부동-소수점