Los números de coma flotante no son de precisión infinita. Algunos números pueden representarse perfectamente (cualquier cosa que involucre potencias de dos, por ejemplo, 1, 1/2 = 0.5, 1/4 = 0.25, etc.), y otros no (por ejemplo, 1/3 no puede descomponerse 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 (int) operador trunca en lugar de rondas, y se puede ejecutar en los casos en que una operación que debe producir resultados en 4,0 3.999999999991 lugar, que se convierte 3.
En cualquier momento está intentando convertir flotantes/dobles en enteros, quiere pensar cuidadosamente sobre qué operador desea usar: truncar (redondear hacia abajo), redondear hacia arriba o redondear hacia el más cercano.
Dado que este es un problema con las representaciones de punto flotante, esto es cierto no solo en F #, sino también en C# y (IIRC) Java y en otros lenguajes.
Cabe señalar que esto no es un "problema" específico F #, sino en la naturaleza de la mayoría de los idiomas, por lo al menos todos de .NET. –