Javascript 浮点数精确计算

在用javascript做浮点数计算的时候,精度大的结果有时候很难和预期结果一致。

下面推荐3个用于执行高精度数学计算的javaScript库。

  1. numbers.js
  2. Numeric Javascript
  3. accounting.js

如果只是用javascript做简单的整数运算可以不用到库,但是如果要做到高精度的浮点运算的话,可以考虑上面的js库。

首先看一下浮点运算错误的例子:

1
console.log(11*22.9); //251.89999999999998

输出结果是251.89999999999998而不是251.9。

要解决上面的问题,可以先把因数放大为整数,最后再除以相应的倍数。

1
console.log(11*(22.9*10)/10); //251.9

+ 浮点加法运算

1
2
3
4
5
6
7
function FloatAdd(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  
}

- 浮点减法运算

1
2
3
4
5
6
7
8
9
function FloatSub(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));  
    //动态控制精度长度  
    n=(r1>=r2)?r1:r2;  
    return ((arg1*m-arg2*m)/m).toFixed(n);  
}

* 浮点乘法运算

1
2
3
4
5
6
function FloatMul(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)   
}

/ 浮点除法运算

1
2
3
4
5
6
7
8
9
10
function FloatDiv(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);   
    }   
}

参考站点