javascript (js) 의 소수점 곱셈 나 누 기 문제 상세 설명

3302 단어
1. js 로 12.32 * 7 계산  결 과 는 얼마 입 니까?정 답: 86.2400000001
왜 이런 문제 가 생 겼 습 니까?어떻게 해결 합 니까?js 는 소수 곱셈 법 을 처리 할 때 bug 가 있 습 니 다. 해결 방법 은 소 수 를 정수 로 바 꾸 어 처리 할 수 있 습 니 다.이상 의 계산 은 12.32 * 100 * 7 / 100 으로 바 꿀 수 있 습 니 다. 결 과 는 86.24 이 고 정확 합 니 다.
또 계산 해 보면 8.80 * 100 * 12 / 100 결과 105.600000000000238.80 도 비슷 한 문제 가 발생 할 수 있다.
정확도 10 배 증가: 8.80 * 1000 * 12 / 1000 결과: 105.6 정상 입 니 다.
16.40 * 1000000 * 6 / 1000000 결과 에 도 문제 가 있 습 니 다.
js 가 더욱 정확하게 실 행 될 수 있 도록 앞으로 js 소수 계산 에서 직접 값 을 10000 배 확대 하고 10000 을 나 누 면 문 제 를 해결 할 수 있다.var num = 38.80;var num2 = 13;alert(num * 10000 * 12 / 10000);
곱 하기 와 나 누 기 이 수 는 테스트 를 통 해 10000 이 가장 적합 하고 작은 숫자 에 문제 가 생 겼 으 며 큰 숫자 (1000000) 에 도 문제 가 생 겼 다.
둘째,
 
  
<br>Number.prototype.rate=function(){ <br>varoStr=this.toString(); <br>if(oStr.indexOf(".")==-1) <br>return1; <br>else <br>returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1)); <br>} <p></p> <p>functiontran(){<br>args=tran.arguments;<br>vartemp=1;<br>for(i=0;i<args.length;i++)<br>temp*=args[i]*args[i].rate();<br>for(i=0;i<args.length;i++)<br>temp/=args[i].rate();<br>returntemp<br>}<br>alert(tran(11,22.9));<br>

이 해결 방법 은 비교적 번 거 로 운 방법 이지 만, 너 로 하여 금 이 문 제 를 해결 하 는 실제 과정 을 대충 이해 하 게 할 수 있다.
 
  
// ,
// :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);
}

좋은 웹페이지 즐겨찾기