Javascript 使用reduce获得对象值的总和,但答案是少了几位小数(JS)

Javascript 使用reduce获得对象值的总和,但答案是少了几位小数(JS),javascript,reduce,Javascript,Reduce,我有以下代码: 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 r

我有以下代码:

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]
]);

代码本身似乎工作得很好,但由于某种原因,当我返回regSum时,答案是3354099999997,而不是335,41。为什么会发生这种情况?我如何更改代码以使其返回预期结果?

您遇到了javascript数字精度问题。在这里阅读更多内容

解决这个问题的一个好方法是缩放数字。因此,只要1.50美元,你就可以得到150美分,并以此为基础进行计算,记住在显示之前乘以0.01。我知道这可能很痛苦,但那是javascript。如果要做的更改太多,您可以始终使用库,例如decimal.js。你可以看这些文件

正如Geuis所说,这是数字精度问题。如果预期结果仅保留小数点后两位数字,则可以将“return regSum;”更改为“return Number(regSum.toFixed);”。 功能支票收银机(价格、现金、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