Округление в C++ довольно часто требуется для выполнения различных задач. Существует большое количество вариантов округления, в зависимости от необходимого значения. Как и большинство мат. операций, они находятся в библиотеке <cmath>, а также более старой библиотеке <math.h>.
Самые распространенные – это функции round(), ceil(), floor() и trunc(). Если первая выполняет математически правильное округление, то есть к ближайшему целому, а 0,5 к более дальнему от 0, то ceil() округляет в сторону большего, а floor() - в сторону меньшего. Последняя функция trunc() скорее не округление, а простое отбрасывание дробной части. Продемонстрируем на примере:
1 2 3 4 5 6 7 8 9 10 11 12 |
void main( void ) { double y; y = floor( 2.8 ); printf( " floor %f\n", y ); y = ceil ( 2.1 ); printf( " ceil %f\n", y ); y = round ( 2.6 ); printf( " round %f\n", y ); y = trunc ( 2.9 ); printf( " trunc %f\n", y ); } |
Программа выведет значения 2, 3, 3 и 2.
Для случая, когда надо округлить число до определенного знака, в библиотеке <math.h> отдельной функции нет, потому обычно используют умножение числа и последующее после округления деление, то есть, например, для округления до сотых:
1 |
y=floor( 2.463*100 )/100; |
Получим значение 2.46.
Стоит отметить также, что в старых компиляторах C++ функция round не доступна и её приходится писать самостоятельно:
1 2 3 4 |
double round(double x) { return floor(x + 0.5); } |
Чем отличается floor() и trunc()?
Они по-разному работают с отрицательными числами: floor(-2.5)=-3, trunc(-2.5)=-2.
Есть ли какая-то функция округления, работающая почти, как round(), но 0.5 округляет к меньшему?
Слишком неопределённая хотелка. Ответ - есть. В крайнем случае можете написать свою.
round(x + 0.5) - подойдёт ?