Tiene que ver con el número de dígitos de precisión en los dos tipos diferentes de coma flotante que está utilizando, y el hecho de que muchos de números no se puede representar exactamente, independientemente de la precisión. (Del lado puramente matemático: los números irracionales superan en número a los racionales)
Tome 2/3, por ejemplo. No se puede representar exactamente en decimal. Con 4 dígitos significativos, se representaría como 0.6667. Con 8 dígitos significativos, sería 0.66666667. El 7 final es un rodeo que refleja que el siguiente dígito sería> 5 si hubiera espacio para guardarlo.
0.6667 es mayor que 0.66666667, por lo que la computadora evaluará 2/3 (4 dígitos)> 2/3 (8 dígitos).
Lo mismo ocurre con su .7 vs .70 en vars dobles y extendidos.
Para evitar este problema específico, intente utilizar el mismo tipo numérico en todo su código. Cuando se trabaja con números flotantes en general, hay muchas cosas pequeñas de las que hay que cuidarse. Lo más importante es no escribir el código para comparar dos carrozas para la igualdad, incluso si deben tener el mismo valor, existen muchos factores en los cálculos que pueden hacer que terminen siendo un poco diferentes. En lugar de comparar por igualdad, debe probar que la diferencia entre los dos números es muy pequeña. Cuán pequeña debe ser la diferencia depende de usted y de la naturaleza de sus cálculos, y generalmente se la conoce como épsilon, tomada del teorema del cálculo y la prueba.
posible duplicado de http://stackoverflow.com/questions/1661273/java-floating-point-arithmetic –
Esto es una de las preguntas más comunes (¿la más común?) sobre SO, y no tiene nada en particular que ver con Delphi, pero con la forma en que los comprters almacenan los números de coma flotante. –
No es eso lo que impide que se vote :) –