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:
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