+ -
当前位置:首页 → 问答吧 → 做了N年js,居然遇到一个这么郁闷的基础问题。

做了N年js,居然遇到一个这么郁闷的基础问题。

时间:2010-05-14

来源:互联网

为什么?
alert(10*10*8.2);

显示 819.9999999999999

作者: michaelzhouh   发布时间: 2010-05-14

呵呵 我也想知道 为什么

作者: cielkong   发布时间: 2010-05-14

看晕了 什么歌意思ia

作者: litengfei   发布时间: 2010-05-14

本身的bug,浮点数计算有缺陷

作者: ONEBOYS   发布时间: 2010-05-14

哈哈,一般都得处理一下。。。JS本身问题吧

作者: iaw2001200   发布时间: 2010-05-14

//浮点数加法运算
  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
   }

  //浮点数减法运算
  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);
  }
  
  //浮点数乘法运算
  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)
   }


//浮点数除法运算
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);
       }
}

作者: EraIT   发布时间: 2010-05-14

JS中,浮点数的计算过程是:先将浮点数转化为二进制,然后进行计算,再转化为十进制,这样子会有少许的误差,所以为了避免这种误差我们可先将浮点数乘以10的n次方,转化为整数计算,然后再转化为小数。

作者: EraIT   发布时间: 2010-05-14

/*   
*   四则运算精度修正函数
*   m     数值1(number)
*   n     数值2(number)
*   op   操作符(string)
*/
function   fixMath(m,   n,   op)   {
    var   a   =   (m+ " ");
    var   b   =   (n+ " ");
    var   x   =   1;
    var   y   =   1;
    var   c   =   1;
    if(a.indexOf( ". ")> 0)   {
        x   =   Math.pow(10,   a.length   -   a.indexOf( ". ")   -   1);
    }
    if(b.indexOf( ". ")> 0)   {
        y   =   Math.pow(10,   b.length   -   b.indexOf( ". ")   -   1);
    }
    switch(op)
    {
        case   '+ ':
        case   '- ':
            c   =   Math.max(x,y);
            m   =   Math.round(m*c);
            n   =   Math.round(n*c);
            break;
        case   '* ':
            c   =   x*y
            m   =   Math.round(m*x);
            n   =   Math.round(n*y);
            break;
        case   '/ ':
            c   =   Math.max(x,y);
            m   =   Math.round(m*c);
            n   =   Math.round(n*c);
            c   =   1;
            break;
    }
    return   eval( "( "+m+op+n+ ")/ "+c);
}

用法如下:
-----------------------
fixMath(2.3,   1.9,   '* ')
fixMath(1.98,   1.9,   '- ')
fixMath(83.50,   74.15,   '- ')

作者: EraIT   发布时间: 2010-05-14

JS对这种浮点数运算有时候会有精确性上的意外的。。。

作者: DEADBOY2004   发布时间: 2010-05-24

alert(parseInt(10) * parseInt(10 * 8.2));

作者: yxuaqu   发布时间: 2010-05-31

记得在征服JS那里有看到

作者: mu0001   发布时间: 2010-05-31