本帖最后由 ahancai 于 2014-01-20 16:59:03 编辑

解决方案 »

  1.   

    就算直接用1.025*100也只是102.49999999~,这是javascript本身的精度损失
    我用的小数点位移,放个大概
            function round(num, n) {
                if (isNaN(num)) return 0;
                num = num + "";
                if (num.indexOf(".") < 0) return num;
                var reg = new RegExp("\.([0-9]{" + n + "})");   //创建一个正则,匹配.02这种格式,小数点后位数自定义
                num = num.replace(reg, "$1.");                  //把.02换成02.
                alert(Math.round(num) / Math.pow(10, n));
            }
    有些验证还没加比如没有补位等等~暂时没发现太大的问题
      

  2.   

    原数字+5/Math.pow(10,dec)后截取dec后的小数位试试
      

  3.   

    function i_round(num,dec){ var sNum = num + ''; 
    var n = sNum.split('.');
    //console.log(n);
    if(n.length<2){return num;}
    var s1 = n[0],s2='';
    for(var i=0;i<n[1].length;i++){
        if(i<dec){
         s1+=n[1][i];
       }else{
         s2+=n[1][i];
       }
    }
    //console.log(s1,s2);
    return parseFloat(parseInt(s1)+Math.round(parseFloat('.'+s2)))/Math.pow(10,dec);}
      

  4.   

    /// <summary>
    /// 保留指定的小数位数[可选择是否使用四舍五入]
    /// </summary>
    /// <param name="source">源数据,传入的值不是number数据类型时将原样返回</param>
    /// <param name="decimalPlace">需要保留的小数位</param>
    /// <param name="isRoundUp">是否是舍五入[可选项:默认true]</param>
    /// <returns>数据类型:Number(浮点数)</returns>
    function toFloat(source,decimalPlace,isRoundUp){
        if( typeof(source) != 'number' ){
            return source;
        };
        decimalPlace = decimalPlace || 0;
        isRoundUp    = typeof(isRoundUp) == 'boolean' ? isRoundUp : !0;
        source       = isRoundUp
                         ? (source*1).toFixed(decimalPlace)
                         : source.toString().replace(new RegExp("([0-9]+\.[0-9]{"+decimalPlace+"})[0-9]*","g"),"$1");
        return source*1;
    }
    alert(toFloat(1.025,2,!1));
    alert(toFloat(2.025,2,!0))
      

  5.   

    //需要四舍五入时,这样就可以了
    alert(toFloat(2.025,2));
      

  6.   

    上面的方法在FF和Chrome之下有兼容性问题,返回值不同.修正一下
    /// <summary>
    /// 保留指定的小数位数[可选择是否使用四舍五入]
    /// </summary>
    /// <param name="source">源数据,传入的值不是number数据类型时将原样返回</param>
    /// <param name="digits">需要保留的小数位</param>
    /// <param name="isRoundUp">是否是舍五入[可选项:默认true]</param>
    /// <returns>数据类型:Number(浮点数)</returns>
    function toFloat(source,digits,isRoundUp){
        if( typeof(source) != 'number' ){
            return source;
        };
        source       = source + 1/Math.pow(10,source.toString().length-1);//往最后补一位
        decimalPlace = digits || 0;
        isRoundUp    = typeof(isRoundUp) == 'boolean' ? isRoundUp : !0;
        source       = isRoundUp
                         ? source.toFixed(digits)
                         : source.toString().replace(new RegExp("([0-9]+\.[0-9]{"+digits+"})[0-9]*","g"),"$1");    return source*1;}
    alert(toFloat(1.025,2));
    alert(toFloat(2.025,2));
      

  7.   

    上面有个变量名没改
    decimalPlace = digits || 0; 
    应该是:
    digits = digits || 0;