Foros del Web » Programando para Internet » Javascript »

Función para sumar dinero importe exacto

Estas en el tema de Función para sumar dinero importe exacto en el foro de Javascript en Foros del Web. Hola ojalá puedan orientarme un poco anda desarrollando una función que me suma un array de inputs. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original function ...
  #1 (permalink)  
Antiguo 16/03/2016, 15:00
Avatar de cassini  
Fecha de Ingreso: julio-2009
Mensajes: 98
Antigüedad: 15 años, 4 meses
Puntos: 0
Función para sumar dinero importe exacto

Hola ojalá puedan orientarme un poco

anda desarrollando una función que me suma un array de inputs.

Código Javascript:
Ver original
  1. function validaImporte() {
  2.             var importes = document.getElementsByName('importePedido[]');
  3.             var total = 0;
  4.             var importeTotal = document.getElementById('importeTotal').value;
  5.             for(var i = 0; i < importes.length; i++) {
  6.                 total = total * 100;
  7.                 total = Math.floor(total);
  8.                 total = total / 100;
  9.                 total += parseFloat(importes[i].value) || 0;
  10.             }
  11.        
  12.             if(total == importeTotal){
  13.                 //habilita un botón para registrar los importes
  14.             }else{
  15.                 alert(total + "  !=  " + importeTotal );
  16.             }
  17.         }

acá mi html

Código HTML:
Ver original
  1. <input type="text" id="a" name="importePedido[]" value="18588.42"><br>
  2.     <input type="text" id="a" name="importePedido[]" value="47453.28"><br>
  3.     <input type="text" id="a" name="importePedido[]" value="70094.16"><br>
  4.     <input type="text" id="a" name="importePedido[]" value="144736.69"><br>
  5.     <p>Total de factura<br><input type="text" id="importeTotal" value="280872.54"></p>
  6.     <input type="button" value="validaImporte" onclick="validaImporte()"><br>

al oprimir el botón de validaImporte como resultado me arroja
280872.54000000004 != 280872.54

mi pregunta es como puedo mejorar mi función para que me limite los decimales a solo 2 en lugar de 280872.54000000004

me he encontrado con toFixed la cual no me funciona porque me redondea el resultado y como trabajo con cantidades exactas como dinero debe precisa la suma

hay alguna función para hacer sumas de dinero? como puedo limitar mi resultado a solo dos decimales???

bueno espero haberme dado a entender la verdad esto ya me complico bastante ya que ando iniciando con javascript

muchas gracias por ayuda!
__________________
Humildad, ante todo humildad
  #2 (permalink)  
Antiguo 16/03/2016, 15:38
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 5 meses
Puntos: 15
Respuesta: Función para sumar dinero importe exacto

Por que en el for usas tanta multiplicación y conversión si solamente con dejar

Código Javascript:
Ver original
  1. total += parseFloat(importes[i].value) || 0;

Bastaría.


Ahora, si dices que quieres sumas exactas ¿porque limitas a 2 decimales y además los quieres truncar???? es más exacto aproximar que truncar :S



Prueba usando

Código Javascript:
Ver original
  1. total=Math.floor(total* 100) / 100
  #3 (permalink)  
Antiguo 17/03/2016, 01:53
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 20 años, 5 meses
Puntos: 25
Respuesta: Función para sumar dinero importe exacto

Me temo que en javaScript la suma exacta, exacta, no existe... debido a que implementa el estándar de la aritmética de punto flotante definida en IEEE-754.

¿¿¿Cómo??? Sí, sí... es verdad. Y quien no se lo crea, que abra una consola del navegador, y escriba

Código:
(0.1 + 0.2 == 0.3)
y verá cómo obtiene un "false" como la copa de un pino.

Y es que
Código:
0.1 + 0.2 = 0.30000000000000004
Así que toFixed es necesario para fijar la precisión con la que estás dispuesto a trabajar.

Realmente esto les pasa a todos los lenguajes EcmaScript y a todos los demás que implementan este estándar. Si alguien tiene más interés en entender por qué pasa esto, en el artículo "Why is 0.1+0.2 not equal to 0.3 in most programming languages?" lo explican muy bien (en inglés).

Espero haberte orientado sobre cómo trabajar con cantidades.

Un saludo
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #4 (permalink)  
Antiguo 17/03/2016, 13:20
Avatar de cassini  
Fecha de Ingreso: julio-2009
Mensajes: 98
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Función para sumar dinero importe exacto

Cita:
Iniciado por ZedGe1505 Ver Mensaje
Por que en el for usas tanta multiplicación y conversión si solamente con dejar

Código Javascript:
Ver original
  1. total += parseFloat(importes[i].value) || 0;

Bastaría.


Ahora, si dices que quieres sumas exactas ¿porque limitas a 2 decimales y además los quieres truncar???? es más exacto aproximar que truncar :S



Prueba usando

Código Javascript:
Ver original
  1. total=Math.floor(total* 100) / 100
gracias por tu respuesta ZedGe1505 debe ser exacto porque estoy trabajando con dinero es un sistema de registro de pagos y facturas, no se debe pasar ni un centavo y debo trabajar hasta con dos decimales.

Me funciono el cambio que me indicaste pero mas tarde con otras cantidades me volvió a arrojar demasiados decimales.

encontré esta otra función

Código Javascript:
Ver original
  1. Number(total.toString().match(/^\d+(?:\.\d{0,2})?/));
que me convierte en cadena y después otra ves en numero según le entiendo por el momento me ha funcionado lo dejo por si le sirve a alguien mas

Saludos y gracias!!!
__________________
Humildad, ante todo humildad
  #5 (permalink)  
Antiguo 17/03/2016, 13:24
Avatar de cassini  
Fecha de Ingreso: julio-2009
Mensajes: 98
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Función para sumar dinero importe exacto

Cita:
Iniciado por eContento Ver Mensaje
Me temo que en javaScript la suma exacta, exacta, no existe... debido a que implementa el estándar de la aritmética de punto flotante definida en IEEE-754.

¿¿¿Cómo??? Sí, sí... es verdad. Y quien no se lo crea, que abra una consola del navegador, y escriba

Código:
(0.1 + 0.2 == 0.3)
y verá cómo obtiene un "false" como la copa de un pino.

Y es que
Código:
0.1 + 0.2 = 0.30000000000000004
Así que toFixed es necesario para fijar la precisión con la que estás dispuesto a trabajar.

Realmente esto les pasa a todos los lenguajes EcmaScript y a todos los demás que implementan este estándar. Si alguien tiene más interés en entender por qué pasa esto, en el artículo "Why is 0.1+0.2 not equal to 0.3 in most programming languages?" lo explican muy bien (en inglés).

Espero haberte orientado sobre cómo trabajar con cantidades.

Un saludo
Muchas gracias eContento que interesante no me lo imaginaba ya que apenas ando escribiendo mis primeras lineas de código en javascript.

Cuando tenga un rato libre leeré el articulo gracias de nuevo

SALUDOS!!!

__________________
Humildad, ante todo humildad

Etiquetas: dinero, exacto, funcion, html, input
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:41.