У меня есть следующий код:

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, ответ будет 335,40999999999997 вместо 335,41. Почему это происходит и как я могу изменить свой код, чтобы он возвращал ожидаемый результат?

0
Mikael Törnwall 1 Мар 2018 в 05:06

3 ответа

Как сказал Гойс, это проблема точности чисел. Если вы ожидали, что результат сохраняет только две цифры после десятичной точки, вы можете изменить «return regSum;» «вернуть номер (regSum.toFixed);». 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 Number(regSum.toFixed(2));
// --> 335,41

}

1
Shawn He 1 Мар 2018 в 03:00

Вы столкнулись с проблемой точности чисел в JavaScript. Подробнее читайте здесь Как работать с точностью чисел с плавающей запятой в JavaScript ?

0
Geuis 1 Мар 2018 в 02:24

Хороший способ обойти это - масштабировать свои числа. Таким образом, за $ 1,50 вы могли бы иметь 150 (центов), и делать математику на основе этого, и не забудьте умножить на 0,01 перед отображением. Я знаю, что это может быть боль, но это javascript. Если для этого потребуется слишком много изменений, вы всегда можете использовать библиотеку, такую как decimal.js. Вы можете прочитать документы здесь.

0
Jordan 1 Мар 2018 в 02:40