原生toFixed
toFixed它是一个四舍六入五成双的诡异的方法(也叫银行家算法),"四舍六入五成双"含义:对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)
现实需求中 需要正常四舍五入 并且保留指定小数位数时 此方法并不适用
所以改造如下
//覆盖默认的toFixed函数 精准四舍五入 并且补0
Number.prototype.toFixed = function(s){
s = Number(s) || 0;
let factor = Math.pow(10, s);
let isNegative = this < 0;
let number = Math.abs(this); // 取绝对值进行计算
let rounded = Math.round(number * factor) / factor;
// 如果原数是负数,则给结果添加负号
if (isNegative) {
rounded = '-' + rounded;
rounded = Number(rounded)
}
let strNum = rounded.toString();
if(s <= 0){
return strNum;
}else{
if(strNum.indexOf('.') === -1){
strNum = strNum + '.'
}
let [intPart, decPart] = strNum.split('.');
if(decPart.length < s){
return strNum.padEnd(strNum.indexOf('.') + s + 1,'0')
}else{
return strNum
}
}
}