我知道我必须在这里遗漏一些东西,我试图将任意数量的数字四舍五入到小数点后两位而没有成功。
var sumOne = 0;
var sumTwo = 0;
[12.993, 12.99, 12.99].forEach(function(number){
sumOne += roundOne(number * 0.1);
sumTwo += roundTwo(number * 0.1);
})
function roundOne(n){
return (Math.round((n *100))/100);
}
function roundTwo(n){
return +(n.toFixed(2));
}
console.log("sumOne is ", sumOne, " sumTwo is ", sumTwo);
https://jsfiddle.net/m90ecdh9/1/
在上面的jsfiddle或代码中,我最终得到以下输出
sumOne is 3.9000000000000004 sumTwo is 3.9000000000000004
为什么这两种舍入方法都不能产生只有两位小数的和?
奇怪的是,如果我尝试在数组中只有两个数字的相同代码,我的结果就像预期的那样,两种方法只有两个小数位的总和。
答案 0 :(得分:1)
浮点精度问题。最简单的解决方案:
console.log("sumOne is ", sumOne.toFixed(2), " sumTwo is ", sumTwo.toFixed(2))
您还可以将您的数字乘以1000,这样它们就会变成整数,对它们进行数学运算,然后再将它除以1000.
答案 1 :(得分:0)
var sumOne = 0;
var sumTwo = 0;
[12.993, 12.99, 12.99].forEach(function(number){
sumTwo += roundTwo(number); // dont *0.1
})
function roundOne(n){
return (Math.round((n *100))/100);
}
function roundTwo(n){
return +(n.toFixed(2));
}
console.log("sumOne is ", sumOne, " sumTwo is ", sumTwo);
https://jsfiddle.net/m90ecdh9/3/
我删除了roundTwo(数字* 0.1),这使得sumTwo正确。
我不确定你为什么要这样做。
现在分别对每个数字进行四舍五入并总结。我认为这是理想的效果。
如果你想把它们围起来。然后在进行固定(2)之前添加0.05。如果要向下舍入减去0.05,这将向上舍入然后将结果清理为两位小数。