做一个四舍五如的函数:
<script>
function ForamtNumber(num,dig)
{
  return Math.round(parseFloat(num)*Math.pow(10,dig))/Math.pow(10,dig);}alert(FormatNumber(netRate,1));</script>

解决方案 »

  1.   

    js 做浮点运算就是这样的
    toFixed不能乱用 
    参考 http://dev.csdn.net/article/26/26293.shtm
      

  2.   

    再给你一个格式函数://============================================================================
    //格式化输出数据,相当于ASP的FormatNumber()函数
    //srcStr:需要格式化的数据;nAfterDot:小数位数
    //直接截取,不舍
    //============================================================================
    function FormatNumber(srcStr,nAfterDot)
    {
     //var pLen=parseInt(nAfterDot);
     
     //return Math.round(parseFloat(srcStr)*Math.pow(10,pLen))/Math.pow(10,pLen);
     var srcStr,nAfterDot;
      var resultStr,nTen;
      srcStr = ""+srcStr+"";
      strLen = srcStr.length;
      dotPos = srcStr.indexOf(".",0);
      if (dotPos == -1){
        resultStr = srcStr+".";
        for (i=0;i<nAfterDot;i++){
          resultStr = resultStr+"0";
        }
        return resultStr;
      }
      else{
        if ((strLen - dotPos - 1) >= nAfterDot){
          nAfter = dotPos + nAfterDot + 1;
          nTen =1;
          for(j=0;j<nAfterDot;j++){
            nTen = nTen*10;
          }
          resultStr = Math.round(parseFloat(srcStr)*nTen)/nTen;
          return resultStr;
        }
        else{
          resultStr = srcStr;
          for (i=0;i<(nAfterDot - strLen + dotPos + 1);i++){
            resultStr = resultStr+"0";
          }
          return resultStr;
        }
      }
     
      
    }
      

  3.   

    你的netRate的确是只有三位小数的,但是你在做*100之前做了parseFloat的强制转换啊,在内存中的数据长度就会扩张到Float类型的长度,然后再读出来*100,当然会多出那么多位
      

  4.   

    不是四舍五入的算法问题,也不是toFixed()函数IE版本不支持的问题;
    这些都没问题;看来大家没有自己去试一试。
    大家都没抓住问题的关键:
    且看以下代码,
    <script>
    netRate = 0.278*100;
    alert("netRate*100 = " + netRate);
    </script>
    理论上netRate应该是27.8是吗?但其实显示是27.800000000000004(至少我这机器是)
    这是为什么?有谁能解释吗?
      

  5.   

    这是浮点数的精度问题,不是bug,属于正常现象
      

  6.   

    不是bug,你做一下四舍五入就可以了!
      

  7.   

    你知道0.09+0.01等于多少吗?0.10吗
    错,是0.099999999999999999
    不信你试试!
    但是0.03或0.07却正确
    如果这样那我想做个步长是0.01的从0.01到1的for循环的话不是糟透了,每次还要四舍五入不成?
      

  8.   

    我做了个检测函数;运行的话你会大吃一惊!
    从0.001 到 0.999 检出258个数有这种现象;
    其中有的甚至连
    value = i*Math.pow(10,-3);
    算法也没折
    各位试试!<script>
    function show_bug(float_num,pow_n){
      return float_num * Math.pow(10,pow_n);
    }//test form 0.001  to 0.999
    var count=0;
    var value;
    for(var i=1 ; i<1000 ; i++){
      value = i*Math.pow(10,-3); //此步有的也无法转化
      var buff_str = show_bug(value,2).toString();
      if(buff_str.length>4){
        document.write(value + " * 1.0E2 = " + buff_str + " <font color=red>error!</font><br>");
      count++;
      }else{
        document.write(value + " * 1.0E2 = " + buff_str + "<br>");
      }
    }
    document.write("总出错数:" + count + "<br>");
    </script>
      

  9.   

    以上还只侧了0.001到0.999中 乘以100;还有X1000,X345 等等。如果这不是BUG,难道是刻意如此,或者这其中有什么技术原因,那究竟是什么?
    有人能释疑吗?