思路:
首次,将数分为整数和小数部分。
其次,判断小数部分是否超出要保留的位数,如果超出,则将超出的部分作为新的小数,使用Math库中round方法去四舍五入取整得出进位(0或者1)。
最后,将此进位数加上保留的小数部分,如果结果多出位数说明小数部分需要向整数进位了,否则输出:整数+小数点+(保留的小数部分+进位数)。
/**
* arg以四舍五入的方式保留小数点后n位
*/
function toFixed(arg, n) {
if(n == 0) {
return Math.round(arg)
}
try {
var d, carryD,
ds = arg.toString().split('.'), // 分割整数和小数
len = ds[1].length
// arg的小数位数超出限制位数n才需要处理
if (len > n) {
// 先截取前n位小数
d = Number(ds[1].substring(0, n))
// 舍去的小数部分是否能够进一:通过 0.[第n位小数后的数] 四舍五入取整,结果为0或1
carryD = Math.round(Number('0.' + ds[1].substring(n, len)))
len = (d + carryD).toString().length
if (len > n) {
// 当d=9...,carryD=1,相加后就得向整数进位了,直接返回 整数部分+1
return Number(ds[0]) + 1
} else if (len == n) {
return Number(ds[0] + '.' + (d + carryD))
}
// 小数以0开头要往前补0
var b0 = '', k = 0
while(k < n && ds[1].substring(0, ++k) == '0') {
b0 += '0'
}
return Number(ds[0] + '.' + b0 + (d + carryD))
}
} catch (e) {}
return arg
}