>  기사  >  웹 프론트엔드  >  JavaScript 부동 소수점 값 연산에서 반올림 오류가 발생하는 이유 살펴보기

JavaScript 부동 소수점 값 연산에서 반올림 오류가 발생하는 이유 살펴보기

巴扎黑
巴扎黑원래의
2017-07-22 16:54:281683검색

문제

자바스크립트에서는 정수와 부동 소수점 숫자 모두 숫자 데이터 유형(간단한 데이터 유형 중 하나)에 속하며, 인쇄할 때 종종 발견됩니다1.0这样的浮点数的结果是1而非1.0,这是由于保存浮点数的内存空间是保存整数值的两倍,所以ECMAScript会不失时机地将浮点数转换为整数。 
上面这种情况虽然让强迫症患者有点不舒服,但是好歹也不是什么大错,接下来这种情况就很吓人了。例如我们在计算0.10.2时,它的输出结果不是0.3,而是0.3000000000000004. 도대체 뭐야? ! 이런 상황을 처음 접하는 아이들의 경우, 자신의 세계관이 도전을 받았다고 느끼시나요?

원인

그래서 영혼과 몸을 구하기 위해 급히 책을 펴보니 책에 명확하게 적혀 있었습니다. ECMAScrip은 IEEE754 수치 부동 소수점 계산 방식을 기반으로 하며 이 수치 계산 방법은 값을 이진수로 저장합니다. 부동 소수점 수는 이진수로 표현될 때 무한하므로 산술 계산을 수행할 때 반올림 오류가 발생하므로 부동 소수점 수 계산의 정확도는 정수 계산의 정확도보다 훨씬 낮습니다. 마지막으로 특정 부동 소수점 숫자의 값을 테스트하지 마세요. Solution

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

1 //加法  2 function FloatAdd(arg1,arg2){  
3        var r1,r2,m; 
4        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0; //参数1为整数};  //参数1小数点后的位数5        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0; //参数2为整数}; //参数2小数点后的位数6        m=Math.pow(10,Math.max(r1,r2));  //取其中较大的位数7        return (arg1*m+arg2*m)/m;        //先将arg1和arg2转换为整数进行计算,然后再转换回浮点数8   }
위 내용을 재인쇄하여 원본 URL을 첨부합니다





toFixed() 메소드도 일부 처리가 가능해야 합니다 반올림 오류 문제를 확실한 방법으로 해결합니다. 구문: ​​number.toFixed(x) x: 0~20을 포함하여 0~20 사이의 값인 소수 자릿수를 지정합니다. 일부 구현에서는 더 큰 숫자 범위를 지원할 수 있습니다. 이 매개변수를 생략하면 대신 0이 사용됩니다.

END


위 내용은 JavaScript 부동 소수점 값 연산에서 반올림 오류가 발생하는 이유 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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