분석
JavaScript에는 Number라는 하나의 숫자 유형만 있으며 Javascript의 모든 숫자는 IEEE-754 표준 형식으로 표시됩니다. 부동 소수점 숫자의 정밀도 문제는 JavaScript에만 국한되지 않습니다. 일부 소수는 이진수로 표현될 때 무한한 자릿수를 갖기 때문입니다.
십진법 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'을 나타낼 수 없지만 어느 정도의 정확도만 달성할 수 있습니다. 이는 필연적인 정밀도 손실입니다.
자바스크립트에서는 문제가 더 복잡합니다. 다음은 Chrome의 일부 테스트 데이터입니다.
입력
1.0-0.9 == 0.1 거짓
1.0-0.8 == 0.2 거짓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 참
솔루션
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를 반환합니다