십진법 0.0100 1100 1100 1100 ...
0.4 0.0110 0110 0110 0110 ...
0.5 0.1
0.6 0.1001 1001 1001 1001...
예를 들어 1 .1, 프로그램 실제로 '1.1'을 나타낼 수는 없지만 어느 정도의 정확도만 달성할 수 있으며 이는 피할 수 없는 정밀도 손실입니다.
1.0999999999999999
자바스크립트에서는 문제가 더 복잡합니다. 다음은 Chrome의 일부 테스트 데이터입니다.
입력
1.0-0.9 == 0.1 거짓
1.0-0.7 == 0.3 거짓
1.0-0.6 == 0.4 참
1.0- 0.5 == 0.5 맞다
1.0-0.4 == 0.6 맞다
1.0-0.3 == 0.7 맞다
1.0-0.2 == 0.8 맞다
1.0-0.1 == 0.9 맞다
해결책
그렇다면 1.0-0.9 != 0.1에서 버그가 아닌 문제를 피하는 방법은 무엇일까요? 다음은 부동소수점 연산 결과를 판단하기 전에 계산 결과의 정밀도를 줄이는 방법입니다. 왜냐하면 정밀도 감소 프로세스는 항상 자동으로 반올림되기 때문입니다.
Number.prototype.isEqual = function(number, digits){
digits = digits == undefine? 10: digits; 10 return this.toFixed(digits) === number.toFixed(digits);
}
(1.0-0.7).isEqual(0.3); // true를 반환합니다