Duplicar posibles:
Why can't decimal numbers be represented exactly in binary?
problem with floating valuesPHP errores de punto flotante con las matemáticas básicas
$var1 = 1;
for ($i=0; $i<30; $i++) {
$var1 += 0.1;
$var2 = floor($var1);
$var3 = $var1-$var2;
if ($var3 == 0.5) {
$var1 = $var2+1;
}
}
La intención de este bucle es contar 1.0, 1.1, 1.2, 1.3, 1.4, y luego saltar a 2.0, 2.1, 2.2, etc.
El problema que estoy recibiendo es que la declaración if
nunca es verdadera. Además, cada décimo cálculo se resuelve en una respuesta científica insana.
¿Cómo puedo solucionar esto? ¡por favor ayuda!
Editar: Escribí la pregunta en un poco de prisa frustrada y fue más de uno, lo veo ahora.
La primera parte de la pregunta realmente fue "¿cómo puedo hacer que este trabajo pase por alto este querk de punto flotante" y "por qué está sucediendo este querk"?
Gracias por todas las buenas respuestas y estoy votando la respuesta como correcta que responde fácilmente a la pregunta central de "cómo hacer que esto funcione".
Usando 0.49 en lugar de 0.5 y> en lugar de == lo hace. Crudo y no es el mejor código del mundo pero resuelve la pregunta original. Gracias a todos por las otras respuestas que voy a leer y seguir para mejorar mi codificación.
Una vez más, muchas gracias.
Posiblemente publicar lo que la "respuesta científica insane" es ??? – mathematician1975
posible duplicación de [problema con valores flotantes] (http://stackoverflow.com/questions/6503994/problem-with-floating-values), [Comprensión de los números de coma flotante en php] (http://stackoverflow.com/questions/10991713/understanding-floating-point-numbers-in-php), etc.pp. – fresskoma
Una gran explicación de los problemas de punto flotante: http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-excaly-in-binary – mtrw