Глиф Учебники

Как округлить число в C

Справочник · C · 1 минута чтения

Если число нужно только показать с нужной точностью — хватит формата printf. Если округлённое значение нужно для дальнейших расчётов — есть функции из math.h.

C
#include <stdio.h>
#include <math.h>

int main(void) {
    double x = 3.14159;
    printf("%.2f\n", x);
    printf("%.0f\n", x);
    printf("round: %.1f, floor: %.1f, ceil: %.1f\n", round(2.6), floor(2.6), ceil(2.2));
    printf("Отрицательные: %.1f %.1f %.1f\n", round(-2.5), floor(-2.5), ceil(-2.5));
    printf("До сотых: %.2f\n", round(x * 100) / 100);
    printf("Целая часть: %d\n", (int)7.9);
    return 0;
}
Вывод
3.14
3
round: 3.0, floor: 2.0, ceil: 3.0
Отрицательные: -3.0 -3.0 -2.0
До сотых: 3.14
Целая часть: 7

Какая функция что делает

ФункцияЧто делает2.5−2.52.4
round(x)к ближайшему целому, половина — от нуля3−32
floor(x)вниз, к меньшему целому2−32
ceil(x)вверх, к большему целому3−23
trunc(x)отбросить дробную часть2−22
(int)xотбросить дробную часть и сделать int2−22

Функции round, floor, ceil и trunc возвращают double, поэтому выводятся форматом %f, а не %d. Если нужно целое, есть lround(x) — возвращает long (формат %ld) — или приведение (int)round(x).

В Linux программу с math.h собирают с ключом -lm в конце: gcc prog.c -o prog -lm. Без него — ошибка undefined reference to 'round'.

Округление до двух знаков

Для вывода: printf("%.2f", x). Для расчётов: round(x * 100) / 100. Но учтите: результат всё равно дробное число в двоичном виде, и точно 3.14 в нём не хранится — только ближайшее к нему. При выводе с %.2f это незаметно.

Подводные камни

Двоичные дроби. Числа вроде 2.675 в памяти хранятся чуть меньше, чем записаны, поэтому округляются «не туда»:

C
#include <stdio.h>
#include <math.h>

int main(void) {
    printf("%.2f\n", 2.675);
    printf("%.2f\n", round(2.675 * 100) / 100);
    return 0;
}
Вывод
2.67
2.68

Первая строка — 2.67, а не 2.68: в памяти лежит 2.67499999…. Во второй строке умножение на 100 дало ровно 267.5, и round округлил половину вверх. Для денежных расчётов дробные числа не используют вовсе: суммы хранят в копейках целыми числами (long long).

Половины в printf. printf округляет точные половины по правилам двоичной арифметики, а не «как в школе». В Linux printf("%.0f", 2.5) выводит 2, а printf("%.0f", 3.5) — 4: половина округляется к чётному. Если нужно школьное округление, сначала примените round, а потом выводите.

Деление целых. 7 / 2 в C даёт 3 ещё до всякого округления, а round(7 / 2) — тоже 3. Сначала сделайте деление дробным: round(7.0 / 2) даёт 4. Подробно — в справке Почему 5 / 2 равно 2.