当总计超过两个时,Javascript中的舍入数字会失败吗?

时间:2017-03-27 00:10:57

标签: javascript numbers rounding

我知道我必须在这里遗漏一些东西,我试图将任意数量的数字四舍五入到小数点后两位而没有成功。

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

为什么这两种舍入方法都不能产生只有两位小数的和?

奇怪的是,如果我尝试在数组中只有两个数字的相同代码,我的结果就像预期的那样,两种方法只有两个小数位的总和。

2 个答案:

答案 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,这将向上舍入然后将结果清理为两位小数。