Lo que está experimentando es un error de redondeo de coma flotante básico.
No podemos representar con precisión 0,1 sin algún error debido a la naturaleza de los números binarios. WolframAlpha reports decimal 0.1 a igual binario ~ 0.00011001100110011 ... ¿Observe cómo no puede representarse finitamente en el sistema de números binarios? Esto significa que tenemos que decidir un punto de corte en el cual dejar de calcular este número, de lo contrario estaríamos aquí para siempre.
Esto introduce un error. Y este error se ha acumulado a medida que el código agrega los números, lo que resulta en una cantidad increíblemente pequeña añadida al final de su suma. Esto asegura que la suma nunca será EXACTAMENTE 0.3, que es lo que está buscando la prueba IF
.
Algunos números decimales, sin embargo, se pueden representar con precisión en binario, como dec 0.5 = bin 0.1 y dec 0.25 = bin 0.01.
We can demonstrate this de forma similar a su código original usando 0.5 = (0.25 + 0.25).
Para obtener más información al respecto, recomiendo The Floating-Point Guide.
Proporciona una buena visión general del concepto de números flotantes y cómo pueden surgir errores en el cálculo. También hay una sección sobre Javascript que muestra cómo superar los errores de redondeo que estás experimentando.
Ver http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-excaly-in-binary – mtrw
Y, más específicamente en JavaScript, http://stackoverflow.com/questions/4088590/0-43-in-javascript-not-1-2-its-1-20000000002-what-happening –
Tal vez deba seguir los consejos en las Preguntas frecuentes y buscar antes de hacer una pregunta que ya se ha hecho miles de veces antes . – paxdiablo