2009-12-16 5 views
10

Estoy construyendo una aplicación web usando JQuery, Stripes, Spring y JPA (Hibernate).¿Debo hacer cálculos de dinero en Javascript o como una llamada AJAX?

Tengo una página que permite a los usuarios ingresar un número de líneas de pedido y cada vez que aparece en el campo de precio, tengo un evento JQuery vinculado al campo que suma todos los campos de precios (esto es un subtotal) , calcula el 10% de impuestos y agrega el impuesto al subtotal. Actualizo la página para mostrar el subtotal, el impuesto y el total general.

Mi pregunta es, ¿debería hacer este cálculo en Javascript? Si es así, ¿cómo puedo estar seguro de que el redondeo, etc. funciona correctamente? Estoy un poco preocupado por los problemas con precisión.

¿Sería mejor para mí hacer una llamada de Ajax para hacer el cálculo en Java?

¡Cualquier consejo sería genial!

Respuesta

15

Como regla general, debe medir lo que es importante para su aplicación. Si se trata de una precisión absoluta, hazlo como una llamada AJAX porque puede haber diferencias de redondeo entre los navegadores, las computadoras y el sistema operativo.

Cuando estaba desarrollando un sitio para una empresa para la que trabajaba tenía el mismo problema, sin embargo, logramos utilizar la parte de JavaScript utilizando un giro ingenioso utilizando solo aritmética de enteros.

Como estábamos lidiando con una moneda con dos dígitos, multiplicamos todo por 10,000 e hicimos los cálculos. Redondeando al número entero y dividido por 10,000 truncando el resultado a dos decimales.

Eso hace que los viajes de ida y vuelta sean agradables y consistentes entre el navegador y el servidor.

+1

+ 1 de mi Paulo. No sabía que JS tenía problemas de precisión con los cálculos aritméticos – ram

+1

Ram, ECMAScript usa cálculos float rápidos pero imprecisos. Entonces, por ejemplo, '.1 + .2 = 0.30000000000000004'. Incluso ECMAScript 5 tendrá estos problemas, porque el sistema de precisión propuesto se consideró demasiado problemático (muy lento y podría romper las aplicaciones existentes) para el estándar. Pasarán otros dos años antes de que un sistema preciso esté incluso estandarizado, y mucho menos disponible. – eyelidlessness

+0

¡A punto de dar el mismo consejo! –

0

Javascript no es el mejor lenguaje para hacer operaciones matemáticas. Encontrará algunas expresiones matemáticas que son verdaderas pero devuelven falso en Javascript. No puedo recordarlos exactamente, pero me enteré cuando hice una calculadora una vez.

Usted puede encontrar información sobre las partes buenas y malas de Javascript aquí: http://www.crockford.com/

+1

No es nada especial acerca de JavaScript. Cualquier lenguaje que use números de coma flotante IEEE 754 (casi todo) tiene los mismos problemas. –

2

las que debe hacerlo en el lado del cliente (que se supone que tiene sus validadores del lado del cliente en su lugar) para que el usuario pueda ver el total (odiaría si hacemos llamadas de ida y vuelta al servidor para ver el total) y también hacerlo en el lado del servidor. La lectura de los valores de POST no sería una buena idea, ya que alguien con un HTTPProxy podría cambiar estos valores si lo está recogiendo de su HTTP POST.

TamperIE una herramienta para manipular HTTP GET y POST y un sandbox donde se puede jugar con

Editar: Sí, se puede hacer el cálculo en el servidor al hacer una llamada AJAX, pero que tendría que valide el total de todos modos (contra el número de productos + impuestos) cuando el usuario envía la orden

3

Si está aceptando pedidos, le recomendaría que siempre haga los cálculos en el lado del servidor antes de confirmar el pedido para evitar que alguien manipule maliciosamente los datos enviados por el cliente. Dicho esto, podría hacer la actualización dinámica usando JavaScript con algún descargo de responsabilidad adecuadamente redactado en torno a la precisión y luego presentar al usuario su cálculo del lado del servidor antes de confirmar el pedido.

6

Por el comp.lang.javascript FAQ, Javascript usa IEEE-754 y por lo tanto tiene una precisión de 15-16 dígitos al hacer matemática de punto flotante. Esto debería ser suficiente para las operaciones monetarias, siempre que utilice el mismo redondeo en Javascript que hace en el lado del servidor.

Pero si necesita estar absolutamente seguro de que es correcto en todos los navegadores, una llamada Ajax sería la medida más segura.

0

Debe utilizar el back-end, en su caso es Java, para hacer sus cálculos estrictos ya que no hay garantía de que los datos no sean manipulados por el usuario final para su beneficio. Y una vez que les envíe una confirmación del precio manipulado, en esencia está obligado por los términos de su contrato de compra, incluso si sabe que han alterado el precio total. No hay una manera fácil de demostrar que han alterado su código o sus cálculos, y que a su vez se perderá. Use el back-end, usted tiene el control total de ese entorno, cualquier error o error de cálculo desde ese ángulo puede culparse directamente a usted.

0

Aunque esta no es una pregunta TAN (el intercambio es un lugar mejor, supongo), no lo usaría en cálculos aritméticos a menos que realmente haya un requisito. Si los puntos decimales se están involucrando, las sirenas se alarman ...

Por ejemplo, ¿sabía usted que:

0.1 + 0.2 = 0.30000000000000004 

por lo que si en realidad se comprueba como 0.1 + 0.2 === 0.3 será false

O aquí es el mejor uno:

  • typeof NaN es el número NaN != NaN es true. PERO NaN !== NaN también true

Y aquí es mi favorita:

var i = 1; 
i = i + ""; 
i + 1 //output will be "11" :) 
console.log(i);//output will be 1 
i - 1 = 0; // this part is the golden shot 

A pesar de que no estoy de acuerdo 100% con el siguiente artículo, Sin duda recomiendo leer:

The Top 10 Things Wrong with JavaScript

Tiene muy buenos puntos.

+0

pero ¿sabes que estos 10 elementos "incorrectos" en realidad hacen que JavaScript sea dinámico y adecuado para desarrollar tipos dinámicos como phython? – vibs2006

+0

@ vibs2006: dinámico no significa inconsistente ... de todos modos no voy a discutir, ese es un artículo que es bueno para leer, aunque no estoy de acuerdo al 100% ... eso solo dice que tienes que saber lo que estás haciendo con javascript ... como una comprensión profunda de eso.Oh, por cierto, me encantaría saber cómo 0.2 + 0.1! = 0.3 lo hace "más dinámico" y "más adecuado" – curiousBoy

Cuestiones relacionadas