JavaScript 中的舍入问题

Rounding problems in JavaScript

我在 JavaScript 中遇到了舍入问题。我正在使用舍入函数:

function roundup(rnum, rlength){
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

var amount = roundup(2253.825, 3);

奇怪的是,当我对数字 2253.825 进行四舍五入时,结果是 2253.82 而必须是 2253.83。当我对数字 5592.825 进行四舍五入时,结果是 5592.83,这是正确的。

知道如何解决这个问题吗?

由于 IEEE 754 双打的工作方式,问题自然而然地出现了。如果您真的想始终获得数学上正确的结果,则需要使用自定义数据类型,例如像 this one.

这样的 BigDecimal 实现

也请看看这个answer,因为它可能会有用。

此处出现浮点舍入错误。 2620.825 * 100262082.49999999997,所以当你四舍五入时,结果是 262082

这里有一个更强大的方法来纠正这个问题:

function roundup(rnum, rlength) {
    var shifted = rnum * Math.pow(10, rlength),
        rounded = Math.round(shifted),
        delta = Math.abs(shifted - rounded);

    if (delta > 0.4999999 && delta < 0.5) {
        rounded += (rounded < 0 ? -1 : 1);
    }

    return rounded / Math.pow(10, rlength);
}

console.log("2620.825 :=> " + roundup(2620.825, 2));
console.log("2621.825 :=> " + roundup(2621.825, 2));
console.log("2620.8255 :=> " + roundup(2620.8255, 2));