>웹 프론트엔드 >JS 튜토리얼 >Javascript 부동소수점 연산 정확도 문제 분석 및 해결_javascript 기술

Javascript 부동소수점 연산 정확도 문제 분석 및 해결_javascript 기술

WBOY
WBOY원래의
2016-05-16 16:54:221252검색

분석

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'을 나타낼 수 없지만 어느 정도의 정확도만 달성할 수 있습니다. 이는 필연적인 정밀도 손실입니다.

1.09999999999999999

자바스크립트에서는 문제가 더 복잡합니다. 다음은 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으로 문의하세요.