Округление с static_cast <int>?

Я чувствую себя глупо, спрашивая об этом, потому что я знаю, как это сделать, но не так, как это определено в книге. (заметьте, я знаю С++)

До сих пор мы перешли только к основам С++. Таким образом, мы знаем переменные, назначение и базовое литье.

В книге у меня возникают проблемы с этой частью проблемы:

  • предложит пользователю ввести десятичное число
  • Преобразуйте это число в ближайшее целое число и напечатайте его на экране

Итак, у меня есть тривиальный код:

double n;
cout<<"Number: ";
cin >> n;
cout <<endl<<static_cast<int>(n)<<endl;

Но я понял, что это не работает для меня. Он всегда будет усекать десятичное число так, что 1.9 → 1, а не ожидаемый 1.9 → 2

Как исправить это, используя только то, что я знаю? (как и в, без round() или если заявления и т.д.)

Является ли это проблемой соблюдения стандартов? В школе я подумал, что у меня что-то подобное работает с Visual С++ 2005 в Windows XP 32 бит, но теперь я в своем доме пытается сделать то же самое, и он не работает. Мой домашний компилятор - gcc 3.3.5 на OpenBSD 64 бит. Или это может быть опечатка в книге?

Ответы

Ответ 1

static_cast<int>(n+0.5)

Или static_cast<int>(n >= 0 ? n + 0.5 : n - 0.5) для более правильного поведения на отрицательном n.

Ответ 2

Просто, чтобы вы знали, это не проблема с вашим компилятором. В С++, когда вы конвертируете float в интегральный тип, значение всегда усекается.