需求:想要保留两位小数,且四舍五入
问题:在一次支付中,面值1元,折扣8.25折,提交订单一直出错,才发现是toFixed的锅,按理说我应该支付0.83,但是如图
toFixed是四舍六入
解决:
//修改toFixed精度不准确
myFixed(target,length) {
var str = target + ''; //将调用该方法的数字转为字符串
var dot = str.indexOf("."); //找到小数点的位置
var decimal = str.split(".")[1];
if(dot!=-1){
if(decimal.length === length) return str;
if(decimal.length <= length){//小数位少于补零
let n = "";
for (let i=0; i<length-decimal.length; i++){
n += "0";
}
return str+n;
}else{//小数位多于做四舍五入
if(Number(decimal[length])>=5){
let s=parseInt(decimal[length-1])+1;
let d = decimal.slice(0,length-1);
decimal =d+s.toString();
//decimal = decimal.slice(0,length-1);
return str.split(".")[0]+"."+decimal;
}else{
decimal = decimal.split("").splice(0,length).join("");
return str.split(".")[0]+"."+decimal;
}
}
}else{//整数补零
let n = "";
for (let i=0; i<length; i++){
n += "0";
}
return str+"."+n;
}
}
或者下面这个方法也可以
function myFixed(val,num){
var scale = Math.pow(10, num);
var numVal = (val * scale).toFixed(num); // 以便四舍五入
var rounded = Math.round(parseFloat(numVal)); // 将字符串转回数字并进行四舍五入
return (rounded / scale).toFixed(num);
}