1. Use js to calculate
12.32 * 7 What is the result? Answer: 86.24000000000001
Why does this problem occur? How to solve it?
There is a bug in js when dealing with multiplication and division of decimals. The solution can be: convert decimals into integers for processing.
The above calculation can be changed to:
12.32 * 100 * 7 /100
The result is: 86.24, correct.
Also calculate:
8.80 * 100 * 12 / 100
Result: 105.60000000000002
38.80 Similar problems will also occur.
Accuracy increased by 10 times:
8.80 * 1000 * 12 / 1000
Result: 105.6
Normal.
16.40 * 1000000 * 6 / 1000000
The result is also problematic
In order to make js execution more accurate, in the future js decimal calculation, directly expand the value by 10000 times and then divide by 10000 to solve the problem.
var num = 38.80;
var num2 = 13;
alert(num * 10000 * 12 / 10000);
The number to be multiplied and divided has been tested to be 10,000. If it is smaller, some numbers will cause problems, and if it is larger (1,000,000), some numbers will also cause problems.
2.
//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);
}