이유: 정수형은 자동으로 정수형으로 변환되어 계산되고, 소수형은 바로 double형으로 변환되어 계산되며, double형은 소수점 이하 15자리까지 정확해야 하므로, JavaScript 소수점 뺄셈을 수행하면 소수점 이하 자릿수가 길어집니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.
<script> var a='38.8'; var b='6.8'; alert(parseFloat(a)-parseFloat(b)); var a=134.22; var b=6; alert(a*b); </script>
위 코드에서 소수점 이하 자릿수가 긴 문자열을 생성하는 이유는 무엇입니까?
이것은 데이터 구조와 관련이 있습니다. 정수형은 자동으로 양수형으로 변환되고, 소수형은 직접 더블형으로 변환되어 계산됩니다. 이는 메모리에서 계산할 때 필요합니다. 컴퓨터는 0과 1만 인식한다는 점을 알아야 합니다. 구체적인 문제는 부동 소수점의 정확성입니다.
float는 소수점 이하 7자리까지 정확합니다.
double은 소수점 이하 15자리까지 정확합니다.
javascript:document.write( (11.3-10.1).toFixed(2) )
toFixed() 메소드는 초과 소수점 자리를 잘라낼 뿐만 아니라 다음 자리를 기준으로 합니다. 차단 위치의 소수점 이하 자릿수는 반올림됩니다. 예를 들어 값 10.739의 경우 소수점 이하 두 자리까지 잘리면 결과는 10.74가 됩니다. 값 10.732의 경우 소수점 이하 두 자리까지 잘리면 결과는 10.73이 됩니다.
JavaScript에서는 소수점 이하 0~20자리의 소수만 가로챌 수 있습니다.
toFixed() 메서드는 상위 버전의 브라우저에서만 지원되므로 사용하기 전에 브라우저가 이 메서드를 지원하는지 확인하는 것이 가장 좋습니다. 확인할 코드는 다음과 같습니다.
var varNumber = 22.234; if (varNumber.toFixed) { varNumber = varNumber.toFixed(2); } else //浏览器不支持toFixed()就使用其他方法 { var div = Math.pow(10,2); varNumber = Math.round(varNumber * div) / div; }
이 문제는 해결될 수 있지만 원하는 것입니다. 물어보면 어떻게 이렇게 소수점이 더 있을 수 있지?
왜 이렇게 이해할 수 없는 답변이 나오는 걸까요?
Google에서 검색한 결과 이것이 JavaScript 부동 소수점 연산의 버그라는 것을 알았습니다.
예: 7*0.8 JavaScript는 다음과 같이 계산합니다. 5.6000000000000005
몇 가지 부동 소수점 연산 함수를 다시 작성하는 솔루션을 온라인에서 찾았습니다.
같은 문제를 겪는 친구들이 참고할 수 있도록 아래에 이 방법을 발췌했습니다.
프로그램 코드
//除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 //调用:accDiv(arg1,arg2) //返回值:arg1除以arg2的精确结果 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1].length}catch(e){} try{t2=arg2.toString().split(".")[1].length}catch(e){} with(Math){ r1=Number(arg1.toString().replace(".","")) r2=Number(arg2.toString().replace(".","")) return (r1/r2)*pow(10,t2-t1); } } //给Number类型增加一个div方法,调用起来更加方便。 Number.prototype.div = function (arg){ return accDiv(this, arg); } //乘法函数,用来得到精确的乘法结果 //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 //调用:accMul(arg1,arg2) //返回值:arg1乘以arg2的精确结果 function accMul(arg1,arg2) { var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(".")[1].length}catch(e){} try{m+=s2.split(".")[1].length}catch(e){} return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m) } //给Number类型增加一个mul方法,调用起来更加方便。 Number.prototype.mul = function (arg){ return accMul(arg, this); } //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)) return (arg1*m+arg2*m)/m } //给Number类型增加一个add方法,调用起来更加方便。 Number.prototype.add = function (arg){ return accAdd(arg,this); }
이러한 함수를 사용하고 싶은 곳에 포함시킨 후 호출하여 계산하세요.
예를 들어 7*0.8로 계산하고 싶다면 (7).mul(8)
으로 변경하면 됩니다. 다른 연산도 비슷해서 더 정확한 결과를 얻을 수 있습니다.
【관련 권장 사항: javascript 학습 튜토리얼】
위 내용은 자바스크립트 소수 뺄셈에 소수점 이하 자릿수가 긴 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!