Home  >  Article  >  Web Front-end  >  Solution instructions for floating point operation BUG in js_javascript skills

Solution instructions for floating point operation BUG in js_javascript skills

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

I have used it in previous projects. I found this code on the Internet before, but under certain conditions, division and addition operations will still cause bugs. I personally optimized this a little

Copy code The code is as follows:

//Division function, used to get accurate division results
//Explanation: There will be errors in the division results of JavaScript , 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 accMul((r1 / r2),pow(10, t2 - t1));
   }
}

Copy code The code is as follows:

//Multiplication function, Used to get 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 multiplying arg1 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)
}

Copy code The code is as follows:

//Intermediate solution to addition operation
function accAdd(arg1, arg2) {
var r1, r2, m, c;
try { r1 = arg1.toString(). split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2))
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
} }
else {
arg1 = Number(arg1.toString().replace() ".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
} }
else { > arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return accDiv((arg1 arg2),m);
}


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