在js计算中,四舍五入保留小数的时候经常用到toFixed()方法,但是该方法存在着隐形的bug,就是在数字比较小的情况下,四舍五入会丢失精度。因此就需要重写toFixed()方法。本人在网络上搜索了2中比较有效的方法,供大家借鉴。若有更好的方法也希望大家给出指导。
1.自定义方法
toFixed2 : function(number, decimal) {
decimal = decimal || 0;
var s = String(number);
var decimalIndex = s.indexOf('.');
if (decimalIndex < 0) {
var fraction = '';
for (var i = 0; i < decimal; i++) {
fraction += '0';
}
return s + '.' + fraction;
}
var numDigits = s.length - 1 - decimalIndex;
if (numDigits <= decimal) {
var fraction = '';
for (var i = 0; i < decimal - numDigits; i++) {
fraction += '0';
}
return s + fraction;
}
var digits = s.split('');
var pos = decimalIndex + decimal;
var roundDigit = digits[pos + 1];
if (roundDigit > 4) {
//跳过小数点
if (pos == decimalIndex) {
--pos;
}
digits[pos] = Number(digits[pos] || 0) + 1;
//循环进位
while (digits[pos] == 10) {
digits[pos] = 0;
--pos;
if (pos == decimalIndex) {
--pos;
}
digits[pos] = Number(digits[pos] || 0) + 1;
}
}
//避免包含末尾的.符号
if (decimal == 0) {
decimal--;
}
return digits.slice(0, decimalIndex + decimal + 1).join('');
},
2.重写Number对象的方法:先放大倍数(10的数量级),然后再缩小倍数(10的数量级)
Number.prototype.toFixed = function(s) {
return (parseInt(this * Math.pow( 10, s ) + 0.5)/ Math.pow( 10, s )).toString();
}
当然该方法也可以这么写
toFixed2: function(n,s){
return (parseInt(n * Math.pow( 10, s ) + 0.5)/ Math.pow( 10, s )).toString();
},