Pregunta

¿Alguien puede explicar por qué int (0.4 * 10.0) es 4 todavía int ((2.4 - 2.0) * 10.0) es < código> 3 ?

Y luego también explique cómo obtener 4 . es decir, ¿realmente tengo que hacer int (System.Math.Round ((2.4 - 2.0) * 10.0)) ?

Es tan feo para algo que debería ser tan simple.

¿Fue útil?

Solución

La representación doble de 2.4 - 2.0 es 0.399999999999. Cuando convierte un número a int, la parte decimal se trunca, por lo que 3.999999999 se trunca a 3.

Otros consejos

  

Y luego también explique cómo obtener 4. es decir, ¿realmente tengo que hacerlo?

     

int (System.Math.Round ((2.4 - 2.0) * 10.0))

     

es tan feo para algo que debería ser tan simple.

Por supuesto que no, solo define

let round x = int System.Math.Round(x)

En realidad, en .Net hay un tipo de datos decimal que le ayudará con este problema, si sus números se pueden representar exactamente como fracciones decimales.

2.4m - 2.0m == 0.4m
2.4 - 2.0   != 0.4

Para convertir un número float en un int use:

deje i = Convert.ToInt32 (f)

Los números de coma flotante no son de precisión infinita. Algunos números se pueden representar perfectamente (cualquier cosa que implique potencias de dos, por ejemplo, 1, 1/2 = 0.5, 1/4 = 0.25, etc.), y otros no (por ejemplo, 1/3 no se puede descomponer exactamente en una secuencia finita de poderes de dos). A menudo, cortar el final de la serie infinita hace que la versión codificada de un número sea ligeramente más pequeña que su valor real.

Combine esto con el hecho de que el operador (int) trunca en lugar de redondear, y puede encontrar casos en los que una operación que debería produce 4.0 da como resultado 3.999999999991, que se convierte en 3.

Cada vez que intente convertir flotantes / dobles a ints, debe pensar detenidamente qué operador desea utilizar: truncar (redondear hacia abajo), redondear hacia arriba o redondear al más cercano.

Dado que este es un problema con las representaciones de punto flotante, esto es cierto no solo en F #, sino en C # y (IIRC) Java y otros idiomas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top