JavaScript 부동 소수점 값 작업 버그

高洛峰
풀어 주다: 2016-10-20 17:53:58
원래의
1380명이 탐색했습니다.

문제

JavaScript에서는 정수와 부동 소수점 숫자 모두 Number 데이터 유형(단순 데이터 유형 중 하나)에 속합니다. 1.0과 같은 부동 소수점 숫자를 인쇄할 때 결과가 은 1.0 대신 1입니다. 이는 부동 소수점 숫자를 저장하는 메모리 공간이 정수 값을 저장하는 메모리 공간의 두 배이므로 ECMAScript는 부동 소수점 숫자를 정수로 변환하는 데 시간을 낭비하지 않습니다.
위 상황이 강박장애 환자들을 다소 불편하게 만들기는 하지만, 어쨌든 큰 실수는 아닐 것입니다. 다음 상황은 매우 두려울 것입니다. 예를 들어 0.1 더하기 0.2를 계산하면 출력 결과는 0.3이 아니라 0.3000000000000004입니다. 도대체 뭐야? ! 이런 상황을 처음 접하는 아이들의 경우, 자신의 세계관이 도전을 받았다고 느끼시나요?

원인

그래서 영혼과 육체를 구하기 위해 급히 책을 펼쳤더니 책에 명확하게 적혀 있었습니다. ECMAScrip은 IEEE754 수치 부동 소수점 계산을 기반으로 합니다. IEEE754가 무엇인지 모르시는 분들은 여기를 클릭하세요. 그런데 이 수치연산 방식은 값을 이진수로 저장한 뒤 계산을 하게 됩니다. 반올림 오류의 존재, 부동 소수점 숫자 계산은 정수 계산보다 훨씬 덜 정확하며 마지막으로 특정 부동 소수점 숫자의 값을 테스트하지 마십시오.
그래서 Yang Jiang 선생님의 말씀이 맞습니다. 젊은이들은 교육 없이는 더 많이 생각하고 덜 공부할 것이기 때문에 여전히 더 많이 공부해야 합니다! ! !

해결책

소위 올바른 약을 처방한다는 것은 문제의 원인을 알면 문제에 대한 해결책을 찾을 수 있다는 것입니다. 이는 부동 소수점 숫자가 무한한 이진법으로 인해 발생하는 오류이므로 정수 연산에서는 이 오류가 존재하지 않습니다. 맞습니다, 그것은 산술 공학에서 부동 소수점 숫자를 정수로 변환하고 그 결과를 부동 소수점 숫자로 변환하는 것입니다. 선생님, 신선한 코드입니다~

//加法  
function FloatAdd(arg1,arg2){  
       var r1,r2,m; 
       try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0; //参数1为整数};  //参数1小数点后的位数
       try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0; //参数2为整数}; //参数2小数点后的位数
       m=Math.pow(10,Math.max(r1,r2));  //取其中较大的位数
       return (arg1*m+arg2*m)/m;   //先将arg1和arg2转换为整数进行计算,然后再转换回浮点数
  }
로그인 후 복사


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!