En algunos casos, la float
representación más cercana a una cantidad numérica puede diferir del valor obtenido mediante el redondeo del double
representación más cercana a un float
. Dos de esas cantidades son 12,344,321.4999999991 y 12,345,678.50000000093. Los números enteros superiores e inferiores a ambas cantidades se representan con precisión como float
, pero el double
más cercano a cada uno de ellos tiene una parte fraccionaria de 0,5 con precisión. Debido a que la conversión de dichos valores double
(entre 2^23 y 2^24, con una fracción de precisión de 0.5) a float
redondeará al entero par más cercano; el compilador en cada caso terminará redondeando lejos del valor que habría estado más cerca del número original.
Tenga en cuenta que, en la práctica, el compilador parece analizar números double
, y luego convertir a float
, así que aunque 12344321.4999999991f debe redondear a 12344321f, en su lugar se redondea a 12344322f. Del mismo modo 12345678.50000000093f debe redondear a 12345679f pero redondea a 12345678f, por lo que incluso en los casos en que la conversión a double
y luego a float
pierda precisión, dicha pérdida de conversión no se puede evitar especificando números directamente como float
.
Por cierto, los valores 12344321.4999999992f y 12345678.50000000094f se redondean correctamente.
@Moozhe No en C#, donde el sufijo decimal es "m". – phoog
@Moozhe Incorrecto, 'd' _is_ for double. 'M' es para decimal (y es abreviatura de" dinero "). http://msdn.microsoft.com/en-us/library/bfft1t3c.aspx –
Vaya, lo siento. Estaba equivocado. –