The method of accurate multiplication and division of floating point numbers in js

Reprinted: http://www.cnblogs.com/liutree/archive/2011/11/29/2267881.html

In js, the multiplication and division of floating-point numbers will have errors. In order to calculate the multiplication and division more accurately, the multiplication and division method needs to be modified.

The division function is used to obtain an accurate division result
Description: The division result of javascript will have errors, which will be more obvious when dividing two floating-point numbers.
Call: accDiv(arg1,arg2)

Return value: 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);
        }

   }

Multiplication function, used to get accurate multiplication results
Description: The multiplication result of javascript will have errors, which will be more obvious when multiplying two floating-point numbers.
Call: accMul(arg1,arg2)

Return value: 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)

  }

In addition, addition and subtraction

The addition function, used to get the exact addition result
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;
}

Subtract function
function accSub(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));
     //last modify by deeka
     //Dynamic control precision length
     n=(r1>=r2)?r1:r2;
     return ((arg2*m- arg1*m)/m).toFixed(n);
}

This article concludes.


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324851905&siteId=291194637