首先感谢各位热心帮忙,然后把疑问中的错误改一下,var pre = 1041.735 * 0.3 =1041.735=》改为 var pre = 3472.45 * 03 = 1041.735,round(pre, 2)=1041.73; // 期望的结果是1041.74 round的实现方法如下: function round(number, precision) { if (isNaN(number)) number = 0; var prec = Math.pow(10, precision); var result = Math.round(number * prec); result = result / prec; return result; }
小数点操作是有误差的,比如按照你的数据,在round内部打印一下数据: function round(number, precision) { if (isNaN(number)){ number = 0; } var prec = Math.pow(10, precision), result = Math.round(number * prec); console.log("result="+number * prec); //result=104173.49999999999 console.log("result="+result); //result=104173 result = result / prec;
return result; } var pre = 3472.45 * 0.3; console.log(round(pre,2));
var pre = 3472.45 * 03 = 1041.735,round(pre, 2)=1041.73; // 期望的结果是1041.74
round的实现方法如下:
function round(number, precision) {
if (isNaN(number))
number = 0;
var prec = Math.pow(10, precision);
var result = Math.round(number * prec);
result = result / prec;
return result;
}
function round(number, precision) {
if (isNaN(number)){
number = 0;
}
var prec = Math.pow(10, precision),
result = Math.round(number * prec);
console.log("result="+number * prec);
//result=104173.49999999999
console.log("result="+result);
//result=104173
result = result / prec;
return result;
}
var pre = 3472.45 * 0.3;
console.log(round(pre,2));
Math.round(number * prec);的时候JS算出来的是104173.49999999999,实际应该是104173.5。解决方案就是把小数都先换成整数(这里要注意不是直接乘10的几次方而是当做字符串处理),再做乘法。
if (isNaN(number))
return NaN;
var str = number.toString(10);
var reg = new RegExp("\\.(\\d{"+precision+"})");
if (/[^\-\.\d]/.test(str) || !reg.test(str))
return number;
str = str.replace(reg,"$1.");
return Math.round(parseFloat(str)) / Math.pow(10, precision);
}
var pre = 3472.45 * 0.3;
alert(round(pre,2));
document.write(Math.round(a*100)/100);
document.write(Math.floor(a*100+0.5)/100);
均输出 10417.35