confusión de difusión estática causada por inconsistencias
Pregunta
Por qué cada vez que compilo y ejecuto el siguiente código en Visual Studio 2008:
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2;
Console::WriteLine(whole_number);
Obtengo un valor incorrecto de 26 mientras la respuesta es 25.
Sin embargo, cuando uso modelos estáticos en los dobles, obtengo la respuesta correcta que es 25.
¿Cómo se puede explicar la salida incorrecta?
Solución
Tiene toda la razón.
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2; // int whole_number = 26.0;
Console::WriteLine(whole_number);
¿Qué esperarías en su lugar? El compilador primero evalúa el lado derecho y luego se convierte implícitamente al int. Por lo tanto, 26.0
se convierte en 26
Cuando lanza antes de agregar, entonces va a agregar 10
y 15
, lo que resulta en 25
:)
Otros consejos
En realidad, no puede confiar en números de coma flotante para redondear de cualquier manera cuando realiza una conversión automática. Si 26.0 está representado por 26.00005, se redondeará a 26, si está representado por 25.999995, se redondeará a 25. Si quiere estar seguro, use la función estándar C round
, definida en math.h
. Decir Así, 26.0 se convierte en 26 no es del todo correcto.