2

este es un ejercicio de JavaScript que pueden encontrar en la siguiente pagina:

EJercicio de freeCodeCamp

Este es mi codigo:

function checkCashRegister(price, cash, cid) {
debugger;
  var toReturn = cash - price;
  var cashArray = [0.01, 0.05, 0.1, 0.25, 1, 5, 10, 20, 100];
  var counter = 0;
  var total = 0;
  var result = {
    status: "",
    change: [["ONE HUNDRED", 0], ["TWENTY", 0], ["TEN", 0], ["FIVE", 0], ["DOLLAR", 0], ["QUARTER", 0], ["DIME", 0], ["NICKEL", 0], ["PENNY", 0]]
  }
  
  total = cid.reduce(function(acc,val){
    return (acc * 100 + val[1] * 100) / 100;
  },0);

  if(total < toReturn){
    result.status = "INSUFFICIENT_FUNDS";
    result.change = [];
    return result;
  } else if(total == toReturn){
    result.status = "CLOSED";
    result.change = cid;
    return result;
  } else {
    result.status = "OPEN";
    
    cid.forEach ( function (i, a){
      while([i][0][1] > 0 && toReturn - cashArray[a] >= 0){
        [i][0][1] = Math.round(([i][0][1] - cashArray[a]) * 100) / 100;
        result.change[counter][1] += cashArray[a];
        toReturn = toReturn - cashArray[a];
        var b = Math.round(toReturn * 100);
        toReturn = b / 100;
    }
    counter++;
    })
    
/*for(var i = cid.length - 1; i >= 0; i--){
      while(cid[i][1] > 0 && toReturn - cashArray[i] >= 0){
        cid[i][1] = cid[i][1] - cashArray[i];
        result.change[counter][1] += cashArray[i];
        toReturn = toReturn - cashArray[i];
        var b = Math.round(toReturn * 100);
        toReturn = b / 100;
      }
    counter++
  }
  }*/
  if (toReturn != 0){
    result.status = "INSUFFICIENT_FUNDS";
    result.change = [];
    return result;
  }
  var filtered = result.change.filter(function(x){
    return x[1] > 0;
  });
  result.change = filtered;
  return result;
}


checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);

Mi duda esta en la parte de forEach y el For que esta comentado en el codigo. El FOR si me da lo que busco, pero en cambio, el forEach me da 0.50000000000002 (aproximadamente), y no me sale 0.5. He intentado usando Math.round(), toFixed(2), etc. pero ninguno resulta.

Alguien podria explicarme por que es que me sale diferente en este caso? alguna otra sugerencia para acelerar el ejercicio? Mejorar su eficiencia?

edit. Mi objetivo es que el programa corra bien.

Max
  • 121
  • 2
  • en cuanto a mejorar su8 eficiencia el for siempre va a ser mas rapido, aun no encuentro el benchmark que se hizo en su momento en una pregunta, en cuanto a [tus calculos aritmerico no son los correcto lee esta pregunta](https://es.stackoverflow.com/questions/197/por-qu%C3%A9-mis-programas-no-pueden-hacer-c%C3%A1lculos-aritm%C3%A9ticos-correctamente) – JackNavaRow Aug 18 '18 at 16:20
  • puedes agregar que tu ejercicio corra bien – JackNavaRow Aug 18 '18 at 16:26
  • editare para expresarme mejor, gracias! – Max Aug 18 '18 at 16:29
  • He leido que el for loop tarda mas que el forEach, reduce, map, etc. Tal vez me estoy confundiendo. – Max Aug 18 '18 at 16:29
  • reduce y map son diferente aunque lo puedes hacer con un for – JackNavaRow Aug 18 '18 at 16:35

0 Answers0