¿Por qué la aritmética de punto flotante en C# es imprecisa?
¿Por qué el siguiente programa imprime lo que imprime?
class Program
{
static void Main(string[] args)
{
float f1 = 0.09f*100f;
float f2 = 0.09f*99.999999f;
Console.WriteLine(f1 > f2);
}
}
La salida es
false
El punto flotante tiene un número limitado de dígitos de precisión. Si ves f1 == f2, es porque cualquier diferencia requiere más precisión de la que puede representar un flotante de 32 bits.
Recomiendo leer Lo que todo informático debería leer sobre el punto flotante
Lo principal es que esto no es solo .Net: es una limitación del sistema subyacente que la mayoría de los lenguajes usarán para representar un flotador en la memoria. La precisión sólo llega hasta cierto punto.
También puedes divertirte con números relativamente simples, teniendo en cuenta que ni siquiera son de base diez. 0,1 (1/10), por ejemplo, es un decimal periódico cuando se representa en binario, al igual que 1/3 cuando se representa en decimal.