0

Tengo este codigo para una caja que debe devolver la cantidad de billetes y monedas de cada tipo, casi funciona, pero hay un fallo que hace que el resultado no sea exacto: justo en la resta donde dice: let cambio = entregado - totalApagar. tengo valores (predefinidos en el html para no tener que escribirlos de 25,10 total a pagar y 40 entregado, el caso es que el resultado de la resta me sale 14,89 cuando deberia salir 14,90 y no se por que...

'use strict'

function cambioCliente() {
  document.getElementById("cambio").innerHTML = '';
  let totalApagar = document.getElementById("totalApagar").value;
  let entregado = document.getElementById("entregado").value;
  totalApagar = convertir(totalApagar);
  entregado = convertir(entregado);

  let cambio = entregado - totalApagar;
  console.log(cambio);
  console.log('Ha entregado ' + entregado + ' , tiene que pagar ' + totalApagar);
  console.log('El cambio es: ' + cambio);


  let valor = [500, 200, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01];
  for (let i = 0; i < valor.length; i++) {
    if (cambio == 0) {
      document.getElementById("cambio").innerHTML += 'Devolución 0€';
    }


    if (valor[i] < cambio) {
      let resto = cambio % valor[i];
      let cantidad = (cambio - resto) / valor[i];
      if (valor[i] >= 5) {
        document.getElementById("cambio").innerHTML += cantidad + 'billetes de ' + valor[i] + ' devolver: <br><hr>';
      }
      if (valor[i] < 5) {
        let formulario = document.getElementById("formulario");
        let informacion = document.getElementById("informacion");
        document.getElementById("cambio").innerHTML += cantidad + 'monedas de ' + valor[i] + ' devolver: <br><hr>';
      }
      cambio = cambio - (valor[i] * cantidad);
    }
  }

}

function convertir(x) {
  if (x.includes(",")) {
    x = x.replace(',', '.');
  }
  return x
}
<form id="formulario" class="col-12">
  <div class="mb-4">
    <label for="totalApagar" class="form-label p-2 mb-3">Total a pagar</label>
    <input type="text" class="form-control text-center" name="totalApagar" id="totalApagar" value="25,10">
  </div>
  <div class="mb-4">
    <label for="entregado" class="form-label p-2 mb-3">Entregado</label>
    <input type="text" class="form-control text-center" name="entregado" id="entregado" value="40">
  </div>

  <button type="button" class="btn" onclick="cambioCliente()">Enviar</button>
</form>
<div id="informacion" class="col-12 info bg-black">
  <p id="cambio"></p>
  <p id="billetes"></p>
  <p id="monedas"></p>
</div>
  • 5
    ¿Responde esto a tu pregunta? [¿Por qué mis programas no pueden hacer cálculos aritméticos correctamente?](https://es.stackoverflow.com/questions/197/por-qu%c3%a9-mis-programas-no-pueden-hacer-c%c3%a1lculos-aritm%c3%a9ticos-correctamente) – padaleiana Dec 30 '20 at 11:27
  • 1
    esto ha sido la respuesta perfecta! Ya lo he solucionado usando numeros enteros y dividiendolos al final para conseguir decimales y funciona genial!!! – Rosa María BJ Dec 30 '20 at 23:55

1 Answers1

1

Lo solucione haciendo todas las operaciones con numeros enteros en centimos y dividiendo entre 100 al final para convertirlos en euros y funciona perfectamente :) me ayudo mucho leer esto: ¿Por qué mis programas no pueden hacer cálculos aritméticos correctamente?

  • Por favor, añada el código que empleó para llegar a la solución, de lo contrario esta publicación sería un comentario y no una respuesta. – Rodrigo Ramírez Dec 31 '20 at 01:06