0

Tengo la siguiente función, el cual toma el total de la factura, suma los montos que se hán abonado, los resta y obtiene el total que falta por pagar:

function PagarTotal(){
    var total_a_pagar = $('#total_a_pagar').val();
    var pagado = 0;     
    for(i in pagos_adicionados){            
        pagado += Number(pagos_adicionados[i]['monto_pago']);
    }       
    total_a_pagar = Number(total_a_pagar) - Number(pagado);
    $('#monto_pago').val(total_a_pagar);
}

El problema es el siguiente, en una simple transacción, con una factura de $ 5.35, abono $ 2 y el total a pagar me devuelve 3.3499999999999996, no entiendo de donde salen tantos decimales, por logica al restar esto deberia dar un total de: $ 5.35 - $ 2 = $ 3.35

He intentado con parseFloat y con Number y con ambas funciones sucede lo mismo.

Nota: No puedo usar toFixed porque esto redondearia los montos y no es lo que necesito, toFixed es practicamente un PARCHE para solucionar termporalmente este error.

StevePHP
  • 172
  • 1
  • 7

3 Answers3

1

FUNCIÓN TOFIXED()

Puedes utilizar para lanzar el valor final con solo uno o dos decimales; los que justo requieras:

La anterior función me ayuda a delimitar entre paréntesis la cantidad de números decimales que se mostrarán después después del punto; ciomo ejemplo te dejo este código

let valor = 12.43564353454
let valorNuevo = valor.toFixed(1)
console.log(valorNuevo)

Como puedes notar en el ejemplo, tengo uan cantidad larga por asi decirlo con decimales, pero antes de mandarla a imprimir la hago acceder a la función/método toFixed() que entre sus paréntesis le indico la cantidad de decimales que deseo se muestren y recién después entonces si mando a imprimir la nueva variable

  • Habia pensado en esa funcion toFixed(2), el problema es que esa funcion redondea el monto y asi no me serviría, aún asi no entiendo porque javascript saca de 5.35 - 2 un total de 3.3499999999999996 – StevePHP Apr 04 '18 at 14:02
  • @StevePHP si esa es tu duda debes aclararla, la pregunta se enfoca mas en como hacerlo no en porque – JackNavaRow Apr 04 '18 at 14:06
  • entonces ya no entendí, es últi o no la respuesta???? @JackNavaRow –  Apr 04 '18 at 14:09
  • para lo que el pregunta es util, para lo que el quiere no ..... – JackNavaRow Apr 04 '18 at 14:10
  • @JackNavaRow Esa no es una respuesta valida hermano, mi pregunta es CLARA, el lenguaje de programacion me esta devolviendo montos incorrectos, y usar toFixed es solo un PARCHE para ese error, no respondas sin antes leer bien te agradezco – StevePHP Apr 04 '18 at 14:16
  • @StevePHP lee el titulo de tu pregunta, todos los que te dieron respuesta es en base a lo que dice el titulo , la unica "diferente" es que en la mia te explico porque pasa eso, solo modifica el titulo de la prregunta y di lo que realmente quieres saber (en estos comentarios mi intencion nunca fue de ofensa), de hecho en el comentario que colocastes aqui fue especificamente lo que querias – JackNavaRow Apr 04 '18 at 14:19
  • 3
    ¿Cómo puede un lenguaje de programación devolver montos incorrectos? – NaCl Apr 04 '18 at 14:45
1

Es un error común no solo en JavaScript. Te invito a leer

Porque mis programas no pueden hacer calculos aritmeticos correctamente

una alternativa de solucion es usar to.Fixed(), asi quitas esos Numbers que son innecesarios

const pagos_adicionados =  [300.2,12,19]
let total_a_pagar = 300
let pagado = 0;     
    for(i in pagos_adicionados){            
        pagado += (pagos_adicionados[i]);
    }       
    total_a_pagar = total_a_pagar - pagado;
    console.log(total_a_pagar.toFixed(2))
JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
1

Puedes intentar utilizando toPrecision(), el cual te permite elegir los decimales que desees, ejemplo:

let a = 5.35;
let b = 2 ;
let c= a -b ; 
console.log(c.toPrecision(3));
JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
Inés Peña
  • 231
  • 1
  • 2
  • 10