Home  >  Article  >  Web Front-end  >  Detailed explanation of decimal point multiplication and division problems in javascript(js)_javascript skills

Detailed explanation of decimal point multiplication and division problems in javascript(js)_javascript skills

WBOY
WBOYOriginal
2016-05-16 16:56:401385browse

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.

Copy the code The code is as follows:



This solution is more troublesome, but it can give you a general idea of ​​how to solve this problem. actual process.
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);
}

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