2011-03-01 19 views
13

Me sorprendió ver a un error resta tan básico en la JS, estoy seguro que la mayoría de ustedes aquí habría experimentado este problema, por favor me ayude con un trabajo por aquí, Todo lo que estoy haciendo es restar un número de 100, que da resultados inesperados, un ejemplo se indica a continuaciónsimple error de la resta en Javascript

100 - 99.1 
// returns 0.9000000000000057 

estoy haciendo algo mal aquí? : S Estoy confundido

+8

Es necesario comprender cómo se almacenan número de coma flotante: http://floating-point-gui.de/ – codaddict

+4

Esto no es un error. Me sorprendió ver esta pregunta de un programador. –

+0

posible duplicado de [¿Se ha roto la matemática de JavaScript?] (Http://stackoverflow.com/questions/588004/is-javascripts-math-broken) –

Respuesta

12

valores de coma flotante nunca son exactos como se espera. Puede usar el objeto Number para convertir esto a la respuesta que necesite.

Number(100).toFixed(2) - Number(99.1).toFixed(2) 
+1

'Number (100 - 99.1) .toFixed (2)' es más terser, y no vas a tener un error aumentado ya que 100 es perfectamente representable en base-2. –

+0

en Trabajos fijos para mí, comenzaré a estudiar los puntos flotantes ahora :) gracias a todos –

+1

"Los valores de los puntos flotantes nunca son precisos como usted espera", más bien depende de las expectativas, ¿verdad? – AakashM

4

En JavaScript, todos los tipos numéricos son objetos Number, que se representan como números de punto flotante de precisión doble.

Por otro lado, se puede recuperar una representación de cadena de estos números a un punto decimal específica mediante toFixed método Number 's, que acepta un número que indica cuántos puntos decimales desea que la cadena devuelta para representar en base a la receptor.

un ejemplo:

var five = 5.00001; 
console.log(five.toFixed(1)); //5.0 
7

Estás trabajando con números de coma flotante, no enteros. Esto es esperado.

La razón es que no se puede representar con precisión números como 0.1 y 0.3 en el sistema binario. Al igual que usted no puede representar 1/3 de forma acumulativa en forma decimal.

1

Al principio evite que asigne el valor flotante a la variable y luego hágalo con expresión directa a una variable. aquí es un ejemplo:

**var c = 80.35-20.35; 
alert(c.toFixed(2));** 

Esto asignará un 60.00, pero otra manera de resolver este volverá 59,99999999.

0

Esta no es una respuesta perfecta, pero funciona.

function format_float_bug(num) 
{ 
    return parseFloat(num.toFixed(15)); 
} 

puede utilizar de la siguiente manera,

format_float_bug(4990 % 10); 

ya continuación el número (49,89999999999999857891452848) primero 15 decimales son como 9999999