toFixed()在chrome、火狐、IE下的计算结果不同
chrome:
火狐:
IE:
可以看到toFixed()
的四舍五入在chrome、火狐上并不准确。
而toFixed()
在chrome、火狐上也并不是网上所说的用银行家舍入法来进行四舍五入的。
原因
那为什么会这样呢,要从toFixed的定义说起,来看ecmascript 规范对toFixed的表述:
解决
假设要四舍五入的数字为number,要保留n位小数,可以先用 ,然后用 Math.round()取整,最后在除去,间接实现四舍五入。另外toFixed()还有个自动补零的功能,也要实现一下,故下面简单封装了一个toFixed方法来实现四舍五入。
function toFixed(number, m) {
if (typeof number !== 'number') {
throw new Error("number不是数字");
}
let result = Math.round(Math.pow(10, m) * number) / Math.pow(10, m);
result = String(result);
if (result.indexOf(".") == -1) {
if(m != 0){
result += ".";
result += new Array(m + 1).join('0');
}
} else {
let arr = result.split('.');
if (arr[1].length < m) {
arr[1] += new Array(m - arr[1].length + 1).join('0')
}
result = arr.join('.')
}
return result
}