Статическая ошибка, вызванная несоответствиями

StackOverflow https://stackoverflow.com/questions/313141

  •  10-07-2019
  •  | 
  •  

Вопрос

Почему всякий раз, когда я компилирую и запускаю следующий код в 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 не совсем правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top