Tengo el siguiente código:

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

El código en sí parece estar funcionando bien, pero por alguna razón cuando devuelvo regSum la respuesta es 335,40999999999997 en lugar de 335,41. ¿Por qué sucede esto y cómo podría cambiar mi código para que devuelva el resultado esperado?

0
Mikael Törnwall 1 mar. 2018 a las 05:06

3 respuestas

Tal como dijo Geuis, es el problema de precisión numérica. Si esperaba que el resultado solo retiene dos dígitos después del punto decimal, puede cambiar "return regSum"; a "return Number (regSum.toFixed);". función checkCashRegister (precio, efectivo, 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 mar. 2018 a las 03:00

Se encuentra con el problema de precisión del número de JavaScript. Lea más aquí Cómo lidiar con la precisión del número de coma flotante en JavaScript?

0
Geuis 1 mar. 2018 a las 02:24

Una buena manera de evitar esto es escalar sus números. Entonces, por $ 1.50, podría tener 150 (centavos), y hacer sus cálculos basados en eso, y recuerde multiplicar por 0.01 antes de mostrar. Sé que puede ser un dolor, pero eso es JavaScript. Si va a ser un gran cambio hacer eso, siempre puede usar una biblioteca, como decimal.js. Puede leer los documentos aquí.

0
Jordan 1 mar. 2018 a las 02:40