Cálculo En la consola de Chrome Javascript que escriba lo siguiente:Javascript - Error
3.1 * 3.68
Y el resultado devuelto es:
11.408000000000001
¿Por qué no es el resultado:
11.408
Cálculo En la consola de Chrome Javascript que escriba lo siguiente:Javascript - Error
3.1 * 3.68
Y el resultado devuelto es:
11.408000000000001
¿Por qué no es el resultado:
11.408
Los errores de punto flotante son bastante normales, esto se debe a los problemas inherentes a la representación de algunos números de punto flotante en binario.
Lea esto: What Every Computer Scientist Should Know About Floating-Point Arithmetic.
Entonces, ¿cuál es la solución hombre? ¿Debería leer un artículo científico al respecto? – Toskan
El motivo del resultado 'curioso' se debe a la representación inexacta de coma flotante internamente de ciertos números. Mientras que 3.1 * 3.68 resulta en 15 decimales, ambos 3.11 * 3.68 y 3.1 * 3.67 dan los 4 decimales y 3 decimales esperados respectivamente.
En la práctica, este 'error' de javascript puede provocar un error de redondeo cuando el resultado esperado tiene 3 decimales, como .745 y el resultado de punto flotante tiene .744999999999999. Ejemplo: 1.9 * 3.55 = 6.744999999999999 (debe ser 6.745). Para los estados financieros, el programa de javascript dará 6.74 en lugar del redondeo esperado de 6.75. Un gran dolor de cabeza para la reconciliación contable a pesar de que ocurre menos de 1 en 1000 casos.
Una forma de obtener los resultados exactos es para un programador JavaScript para post-proceso el resultado como en:
var r=1.9*3.55; r=r.toFixed(3); //=6.745, knowing that the results should be 3 decimals r=r.toFixed(2); // round to 2 decimals
Es lamentable que ningún motor de Javascript de hoy puede hacer este pequeño paso fácil para llegar a la Resultado Esperado. Para garantizar una aritmética decimal exacta (al menos para uso financiero en oposición al uso científico o astronómico), todo lo que el motor de JavaScript necesita hacer es determinar n = (n. ° de decimales en el resultado) y luego hacerlo a Fijo (n) en el flotante interno punto resultado
lo que hago siempre es hacer * 10 entonces var r = ((1.9 * 10) * (3.55 * 10))/10 –
puede utilizar el método toFixed de JavaScript más detalle:
Método del Número
Implementado en JavaScript 1.5
ECMAScript edición de ECMAScript 3ª Edición
Sintaxis
Number.toFixed ([]) dígitos
parámetros
dígitos El número de dígitos que aparecen después del punto decimal; este puede ser un valor entre 0 y 20, inclusive, y las implementaciones pueden admitir opcionalmente un rango más amplio de valores. Si se omite este argumento, se trata como 0.
devoluciones
una representación de cadena del número que no utiliza la notación exponencial y tiene exactamente dígitos dígitos después del punto decimal.El número se redondea si es necesario, y la parte fraccional se rellena con ceros si es necesario para que tenga la longitud especificada. Si number es mayor que 1e + 21, este método simplemente llama a Number.toString() y devuelve una cadena en notación exponencial.
Lanza
RangeError Si los dígitos es demasiado pequeño o demasiado grande. Los valores entre 0 y 20, inclusive, no causarán RangeError. Las implementaciones también admiten valores más grandes y más pequeños. TypeError Si este método se invoca en un objeto que no es un número.
para su uso problemático (3.1 * 3.68) .Arreglado (3); //11.408
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toFixed
http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money –
¿cuál es la solución? – Toskan
ah, la solución es esta: http://stackoverflow.com/a/14728473/533426 – Toskan