static_cast <int> (std::floor(x));
делает в значительной степени то, что вы хотите, да. Это дает вам ближайшее целое число, округленное до -infinity. По крайней мере, пока ваш ввод находится в диапазоне, представленном целыми числами.
Я не уверен, что вы имеете в виду, добавляя .5 и еще много чего, но это не даст того же эффекта
И std :: floor возвращает double, потому что это самое общее. Иногда вы можете захотеть округлить число с плавающей запятой или удвоить, но сохранить тип. То есть, от 1,3f до 1,0f, а не до 1.
Это было бы трудно сделать, если бы std :: floor вернул int. (или, по крайней мере, у вас будет дополнительный ненужный состав, замедляющий процесс).
Если floor выполняет округление только без изменения типа, вы можете привести его к int, если / когда вам нужно.
Другая причина в том, что диапазон двойников намного больше, чем у целых. Может оказаться невозможным округлить все двойные числа до целых.