El punto flotante tiene una precisión limitada, y se basa en binario en lugar de decimal. El número decimal 13.45 no se puede representar con precisión en el punto flotante binario, por lo que redondea hacia abajo. La multiplicación por 20 exagera aún más la pérdida de precisión. En este punto, tiene 268.999 ... - no 269 - por lo tanto, la conversión a entero se trunca en 268.
Para redondear al número entero más cercano, puede intentar agregar 0.5 antes de volver a convertirlo en entero.
para la aritmética "perfecta", se podría tratar de usar un decimal o numérico racional - Creo que C# tiene bibliotecas para ambos, pero no estoy seguro. Sin embargo, estos serán más lentos.
EDIT - He encontrado un tipo "decimal" hasta el momento, pero no es un racional - Puedo estar equivocado acerca de que esté disponible. El punto flotante decimal es inexacto, al igual que el binario, pero es el tipo de inexactitud al que estamos acostumbrados, por lo que da resultados menos sorprendentes.
Potencial para una pregunta de entrevista perversa: ¿Cuáles son los valores de i e i2? –
... y aquí hay un manual de IEEE y algo de información de registro de la máquina. Y un marcador de pizarra. ¡Ir! –
Vea también http://stackoverflow.com/questions/2342396 y http://stackoverflow.com/questions/2345534 y http://stackoverflow.com/questions/2225503 y http://stackoverflow.com/questions/2494724 –