>웹 프론트엔드 >JS 튜토리얼 >Javascript 부동 소수점 연산에 대한 문제 분석 및 해결 방법_javascript 기술

Javascript 부동 소수점 연산에 대한 문제 분석 및 해결 방법_javascript 기술

WBOY
WBOY원래의
2016-05-16 17:24:161013검색

십진법 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.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 맞다
해결책
그렇다면 1.0-0.9 != 0.1에서 버그가 아닌 문제를 피하는 방법은 무엇일까요? 다음은 부동소수점 연산 결과를 판단하기 전에 계산 결과의 정밀도를 줄이는 방법입니다. 왜냐하면 정밀도 감소 프로세스는 항상 자동으로 반올림되기 때문입니다.



복사 코드 코드는 다음과 같습니다.(1.0-0.9).toFixed(digits)                                                                                                                                                 사이
parseFloat((1.0-0.9).toFixed( 10)) === 0.1 // 결과는 True
parseFloat((1.0-0.8).toFixed(10)) === 0.2 // 결과는 True
parseFloat((1.0-0.7)입니다. toFixed(10)) === 0.3 // 결과는 True입니다
parseFloat((11.0-11.8).toFixed(10)) === -0.8 // 결과는 True에 대한 메서드 재정의





코드 복사 코드는 다음과 같습니다.// 여부를 결정합니다. isEqual 도구 메서드를 통해 값이 동일합니다
function isEqual(number1, number2, digits){
digits = digits == undefine? 10: digits; // 기본 정밀도는 10입니다.
return number1 . toFixed(숫자) === number2.toFixed(숫자);
}

isEqual(1.0-0.7, 0.3); // true를 반환합니다
// 기본 확장 방법, 객체 지향 스타일 선호

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를 반환합니다

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.