使用reduce求对象值求和,结果少了几个小数(JS)

Using reduce to get a sum of object values, but the answer is a few decimals short (JS)

我有以下代码:

function checkCashRegister(price, cash, cid) {

    // Move cid into an object
    var cashReg = cid.reduce(function(prev, curr) {
        prev[curr[0]] = curr[1];
        return prev;
    }, {});

    // Total money in the register
    var regSum = Object.values(cashReg).reduce(function(a, b) {
        return a + b;
    }, 0);

    return regSum;
    // --> 335,41
}

checkCashRegister(19.50, 20.00, [
    ["PENNY", 1.01],
    ["NICKEL", 2.05],
    ["DIME", 3.10],
    ["QUARTER", 4.25],
    ["ONE", 90.00],
    ["FIVE", 55.00],
    ["TEN", 20.00],
    ["TWENTY", 60.00],
    ["ONE HUNDRED", 100.00]
]);

代码本身似乎工作得很好,但出于某种原因,当我 return regSum 时,答案是 335,40999999999997 而不是 335,41。为什么会发生这种情况,我该如何更改我的代码才能return 预期的结果?

您 运行 遇到了 javascript 数字精度问题。在这里阅读更多 How to deal with floating point number precision in JavaScript?

解决这个问题的一个好方法是增加你的数字。因此,对于 1.50 美元,您可以得到 150(美分),并以此为基础进行计算,并记得在显示之前乘以 0.01。我知道这可能很痛苦,但那是 javascript。如果这样做的改变太大,您总是可以使用库,例如​​ decimal.js。您可以阅读文档 here

正如Geuis所说,是数字精度问题。如果您希望结果只保留小数点后两位,可以将"return regSum;"改为"return Number(regSum.toFixed);"。 函数 checkCashRegister(价格,现金,cid){

// Move cid into an object
var cashReg = cid.reduce(function(prev, curr) {
    prev[curr[0]] = curr[1];
    return prev;
}, {});

// Total money in the register
var regSum = Object.values(cashReg).reduce(function(a, b) {
    return a + b;
}, 0);

return Number(regSum.toFixed(2));
// --> 335,41

}