Home  >  Article  >  Web Front-end  >  Methods to solve floating point errors in multiplication in JS_javascript tips

Methods to solve floating point errors in multiplication in JS_javascript tips

WBOY
WBOYOriginal
2016-05-16 17:05:291315browse

Floating point errors will occur when doing decimal multiplication in JS. You can test it specifically:

<script> <br>alert(11*22.9) <br></script>

The result is 251.89999999999998 instead of 251.9

This problem must be a headache for many people. So how to solve it? Here is a solution.

1.

Copy code The code is as follows:

<script> <br> alert(11*(22.9*10)/10); <br></script>

The general idea to solve the problem is to first amplify the factor into an integer, and finally divide it by the corresponding multiple, so that the correct result can be obtained.
2.
Copy code The code is as follows:



This solution is more troublesome, but it can give you an overview of the actual process of solving this problem.

You can also use the rounding method. You can use Math.round in js to achieve the rounding of integers. If you need to achieve the accuracy to the decimal point, you need to write a function.

Copy code The code is as follows:

function ForDight(Dight,How) {
Dight = Math.round(Dight*Math.pow(10,How))/Math.pow(10,How);
return Dight;
}

//Division function, used to obtain accurate division results
//Explanation: The division result of JavaScript will have errors, which will be more obvious when dividing two floating point numbers. This function returns a more accurate division result.
//Call: accDiv(arg1,arg2)
//Return value: the exact result of dividing arg1 by 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);
}
}

//Add a div method to the Number type to make it more convenient to call.
Number.prototype.div = function (arg){
return accDiv(this, arg);
}

//Multiplication function, used to obtain accurate multiplication results
//Explanation: The multiplication result of JavaScript will have errors, which will be more obvious when two floating point numbers are multiplied. This function returns a more accurate multiplication result.
//Call: accMul(arg1,arg2)
//Return value: the exact result of arg1 multiplied by 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)
}

// Add a mul method to the Number type to make it more convenient to call.
Number.prototype.mul = function (arg){
return accMul(arg, this);
}

//Addition function, used to obtain accurate addition results
//Explanation: The addition result of JavaScript will have errors, which will be more obvious when adding two floating point numbers. This function returns a more accurate addition result.
//Call: accAdd(arg1,arg2)
//Return value: the exact result of arg1 plus 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
}

//Add an add method to the Number type to make it more convenient to call.
Number.prototype.add = function (arg){
return accAdd(arg,this);
}

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn