2011-07-05 15 views
5

Estoy creando una aplicación de presupuesto con javascript. Debo permitir que javascript haga la mayoría de las operaciones. Así que tengo algunos controles donde el usuario cambia la cantidad deseada para una categoría y mi aplicación muestra los nuevos montos para las subcategorías. lo que si tengo + Auto $ 50.23 - Gas $ 30.25 - Mantenimiento $ 6,27 - Seguro $ 10,02 - ...Operaciones de divisas con javaScript?

lo tanto, si el usuario cambia de Auto 50.23 a 90.00, las cantidades por gas, mantenimiento, seguros, etc. reflejaría el% de aumento en su categoría principal.

El problema es que después de algunas operaciones pierdo precisión y crea algunos errores desagradables. La mayoría de las veces los números no se suman (como deberían). Después de cambiar la cantidad de auto unas veces y luego configurarlo en 0, las otras cantidades no siempre van a 0, y a veces van por debajo de 0 dándome un NaN, así que si luego cambio Auto por algo mayor que 0, mi NaN se quedará NaN.

Acabo de escuchar a alguien decir que las fracciones en javascript son aproximaciones, que es otro problema. Traté de google para ver si esto es un hecho, pero no pude encontrar nada (quizás no busqué los términos correctos)

Estoy seguro de que algunos de ustedes se han encontrado con problemas similares, ¿qué harían? ¿sugerir? Alguien sugirió multiplicar mi número original por 100 y luego hacer todas las operaciones, pero me temo que esto no me ayudará a salir del problema de perder precisión.

¿Alguna idea?

¡Agradeceré su ayuda!

+0

Cada número en JS es un número en coma flotante, pero no debe perder tanta precisión en los números de 2 posiciones. Necesitarás literalmente miles o millones de iteraciones antes de que el redondeo de FP se convierta en un problema. ¿Puedes mostrar el bit relevante de tu código donde haces los cálculos? No necesitamos toda la página, solo esa pequeña parte. –

+0

bien, probablemente pueda crear su propia clase con propiedades como dólares y centavos (todo en números enteros) e implementar sus propias operaciones – spacevillain

+0

fp los errores de suma son los errores más comunes en javascript. – jzilla

Respuesta

9

Los números binarios de coma flotante son ineptos en el manejo de fracciones decimales, por lo que 0.1 + 0.2 no es igual a 0.3. Esto es el error más frecuentemente reportado en JavaScript, y es una consecuencia intencional de haber adoptado el estándar IEEE para la aritmética de punto flotante binario (IEEE 754). Este estándar es adecuado para muchas aplicaciones , pero viola la mayoría de las cosas que aprendió sobre los números en la escuela secundaria. Afortunadamente, la aritmética de números enteros en coma flotante es exacta, por lo que los errores de representación decimales se pueden evitar escalando. Por ejemplo, los valores en dólares se pueden convertir a valores de centavos enteros multiplicándolos por 100. Los centavos luego se pueden agregar con precisión. La suma se puede dividir por 100 para convertir de nuevo a dólares. La gente tiene una expectativa razonable de cuando cuentan que los resultados serán exactos.

"JavaScript: The Good Parts por Douglas Crockford. Copyright 2008 Yahoo Inc., 978-0-596-54574-8."

3

Siempre con moneda mantener un seguimiento de él como enteros internamente. Todas las operaciones deben hacerse en enteros. Solo tiene el decimal para mostrar.

check out this fiddle si está pensando en usar puntos decimales para realizar un seguimiento del dinero.

+0

Aquí se actualiza fiddle: http://jsfiddle.net/PfPbt/15/ donde puede ver la diferencia y la solución recomendada. –