자바스크립트 소수 뺄셈에 소수점 이하 자릿수가 긴 이유는 무엇입니까?

青灯夜游
풀어 주다: 2021-06-18 15:50:17
원래의
2557명이 탐색했습니다.

이유: 정수형은 자동으로 정수형으로 변환되어 계산되고, 소수형은 바로 double형으로 변환되어 계산되며, double형은 소수점 이하 15자리까지 정확해야 하므로, JavaScript 소수점 뺄셈을 수행하면 소수점 이하 자릿수가 길어집니다.

자바스크립트 소수 뺄셈에 소수점 이하 자릿수가 긴 이유는 무엇입니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.

자바스크립트에서 소수점 이하 자릿수를 뺄 때 긴 문자열이 나타나는 이유

<script>
var a=&#39;38.8&#39;;
var b=&#39;6.8&#39;;
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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