Почему всякий раз, когда я компилирую и запускаю следующий код в Visual Studio 2008:
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2;
Console::WriteLine(whole_number);
Я получаю неверное значение 26, а ответ - 25.
Однако, когда я использую статическое приведение к двойникам, я получаю правильный ответ - 25.
Как можно объяснить неправильный вывод?





Совершенно верно.
double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2; // int whole_number = 26.0;
Console::WriteLine(whole_number);
Что бы вы ожидали вместо этого? Компилятор сначала оценивает правую часть, а затем неявно преобразует ее в int. Таким образом, 26.0 становится 26.
При трансляции перед добавлением вы собираетесь добавить 10 и 15, в результате получится 25 :)
Фактически, вы не можете рассчитывать на округление чисел с плавающей запятой в любом случае при автоматическом преобразовании. Если 26.0 представлено как 26.00005, оно будет округлено до 26, если оно представлено как 25.999995, оно будет округлено до 25. Если вы хотите быть уверенным, используйте стандартную функцию C round, определенную в math.h. Сказать Таким образом, 26,0 становится 26 не совсем правильно.
тем не менее, вы действительно правы в принципе. static_cast <int> (val + 0.5) исправляет это. (раунд - c99, недоступен в C++)
если это является 26.0, то станет 26. Совершенно верно. но если 25.999995, как вы говорите, это 25, как вы тоже говорите.