Непонимание static_cast, вызванное несоответствиями - PullRequest
1 голос
/ 24 ноября 2008

Почему всякий раз, когда я компилирую и запускаю следующий код в Visual Studio 2008:

double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2;
Console::WriteLine(whole_number);

Я получаю неправильное значение 26, а ответ - 25.

Однако, когда я использую статическое приведение к двойникам, я получаю правильный ответ - 25.

Как объяснить неправильный вывод?

Ответы [ 2 ]

9 голосов
/ 24 ноября 2008

Это абсолютно верно.

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:)

2 голосов
/ 24 ноября 2008

На самом деле, вы не можете полагаться на числа с плавающей запятой в ту или иную сторону при выполнении автоматического преобразования. Если 26.0 представлено как 26.00005, оно будет округлено до 26, если оно представлено как 25.999995, оно будет округлено до 25. Если вы хотите быть уверенным, используйте стандартную функцию C round, определенную в math.h. Сказать Таким образом, 26.0 становится 26 не совсем правильно.

...