Home > Web Front-end > JS Tutorial > body text

Methods to solve bugs in JS floating point operation_javascript skills

WBOY
Release: 2016-05-16 17:40:36
Original
968 people have browsed it

37.5*5.5=206.08 (JS calculated this result, I rounded to two decimal places)
I first suspected it was a rounding problem, so I directly used JS to calculate the result: 206.08499999999998
How could this happen? How could there be such an extra decimal point when multiplying two numbers with only one decimal point?
I Googled it and found out that this is a bug in JavaScript floating point operations.
For example: 7*0.8 JavaScript calculates it as: 5.6000000000000005

I found some solutions online, which is to rewrite some floating point operations functions or directly expand the multiple operations.
These methods are excerpted below for reference by friends who encounter the same problem:

Copy code The code is as follows:

//Division function, used to get accurate division results
//Note: 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);
}

//Subtraction function, used to obtain accurate subtraction results
//Explanation: The subtraction result of JavaScript will have errors, which will be more obvious when adding two floating point numbers. This function returns a more accurate subtraction result.
//Call: accSubtr(arg1,arg2)
//Return value: the exact result of arg1 minus arg2
function accSubtr(arg1,arg2){
var r1,r2,m,n ;
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));
//Dynamic control of precision length
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
}
//Give Number type Add a subtr method to make it more convenient to call.
Number.prototype.subtr = function (arg){
return accSubtr(arg,this);
}

Include these functions where you want to use them, and then call it to calculate.

/ If you know the number of decimal places, you can consider amplifying the floating point number to an integer (and finally dividing it by the corresponding multiple), and then perform the operation, so that you can get the correct result

Copy code The code is as follows:

<script> <br>alert(11*(22.9* 10)/10);<br></script>
Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template