js浮点数值计算

引:alert(0.1 + 0.2 == 0.3);  // false 
javascript

分析:浮点数值在js里存储的最高精度为17位小数,因此0.1+0.2=0.30000000000000004而不是0.3,实际上全部基于IEEE754的浮点计算都会存在偏差,ECMAScript并不是独此一家。java

解决:将js的浮点计算转换为整型数值计算,如上能够用 (0.1*10 + 0.2*10)/10 = 0.3 来表示。this

具体实现以下:prototype

<script type="text/javascript">

    // 两个浮点数求和
    function accAdd(num1,num2){
       var r1,r2,m;
       try{
           r1 = num1.toString().split('.')[1].length;
       }catch(e){
           r1 = 0;
       }
       try{
           r2=num2.toString().split(".")[1].length;
       }catch(e){
           r2=0;
       }
       m=Math.pow(10,Math.max(r1,r2));
      
       return Math.round(num1*m+num2*m)/m;
    }
    
    // 两个浮点数相减
    function accSub(num1,num2){
       var r1,r2,m;
       try{
           r1 = num1.toString().split('.')[1].length;
       }catch(e){
           r1 = 0;
       }
       try{
           r2=num2.toString().split(".")[1].length;
       }catch(e){
           r2=0;
       }
       m=Math.pow(10,Math.max(r1,r2));
       n=(r1>=r2)?r1:r2;
       return (Math.round(num1*m-num2*m)/m).toFixed(n);
    }
    // 两数相除
    function accDiv(num1,num2){
       var t1,t2,r1,r2;
       try{
           t1 = num1.toString().split('.')[1].length;
       }catch(e){
           t1 = 0;
       }
       try{
           t2=num2.toString().split(".")[1].length;
       }catch(e){
           t2=0;
       }
       r1=Number(num1.toString().replace(".",""));
       r2=Number(num2.toString().replace(".",""));
       return (r1/r2)*Math.pow(10,t2-t1);
    }
    //乘法
    function accMul(num1,num2){
       var m=0,s1=num1.toString(),s2=num2.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);
    }
    //给Number对象的原型增长方法,调用起来更加方便。 
    Number.prototype.add = function (arg) {
        return accAdd(arg, this);
    };
    Number.prototype.sub = function (arg) {
        return accSub(arg, this);
    };
    Number.prototype.mul = function (arg) {
        return accMul(arg, this);
    };
    Number.prototype.div = function (arg) {
        return accDiv(arg, this);
    };
  </script>
相关文章
相关标签/搜索