首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

: 1.025四舍五入后,只等于1.02

2014-01-22 
求助:1.025四舍五入后,只等于1.02本帖最后由 ahancai 于 2014-01-20 16:59:03 编辑script typetext/jav

求助: 1.025四舍五入后,只等于1.02
本帖最后由 ahancai 于 2014-01-20 16:59:03 编辑 <script type="text/javascript"> 

function i_round(num,dec){ 

var sNum = num + ''; 
var idx = sNum.indexOf("."); 
    

    if(idx<0)  
        return num; 

    var n = sNum.length - idx -1; 

    if(dec < n){ 
        var e = Math.pow(10,dec); 

        return Math.round(num * e) / e; 

  
    }else{ 
        return num; 
    } 



}

alert(i_round(2.025,2));

</script> 




1.025四舍五入后,只等于1.02
2.025四舍五入后,会等于2.03

有没有大神有解决方法啊.




[解决办法]
就算直接用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));
        }

有些验证还没加比如没有补位等等~暂时没发现太大的问题
[解决办法]
原数字+5/Math.pow(10,dec)后截取dec后的小数位试试
[解决办法]
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);

}
[解决办法]
上面的方法在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));

热点排行