在js中Number可以使用toFixed来四舍五入保存到指定精度
console.log(3.3333.toFixed(2)); //3.33
console.log(3.3.toFixed(2)); //3.30
但是精度并不准确,比如如下代码
console.log(0.145.toFixed(2));//0.14
console.log(0.185.toFixed(2));//0.18
主要是因为计算机的小数实现原理是以二进制的分数的问题
我们可以重写toFixed方法来实现数学上的四舍五入,主要逻辑就是先把数据转成整数计算,然后在还原成小数,最后填0补齐小数位数
Number.prototype.toFixed = function (d) {
let times = Math.pow(10,d+1);
let des = parseInt(this*times +5)/times +""
des+=des.includes(".")?"":"."
while(d-des.split(".")[1].length>0){
des+="0"
}
let [a,b] = des.split(".")
return a+"."+b.substring(0,d);
};
结果
console.log(0.145.toFixed(2));//0.15
console.log(0.185.toFixed(2));//0.19