Как округлить число в C
Если число нужно только показать с нужной точностью — хватит формата printf. Если округлённое значение нужно для дальнейших расчётов — есть функции из math.h.
#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.5 | 2.4 |
|---|---|---|---|---|
round(x) | к ближайшему целому, половина — от нуля | 3 | −3 | 2 |
floor(x) | вниз, к меньшему целому | 2 | −3 | 2 |
ceil(x) | вверх, к большему целому | 3 | −2 | 3 |
trunc(x) | отбросить дробную часть | 2 | −2 | 2 |
(int)x | отбросить дробную часть и сделать int | 2 | −2 | 2 |
Функции 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 в памяти хранятся чуть меньше, чем записаны, поэтому округляются «не туда»:
#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.