C/C++

Как округлить число в с++ без использования библеотек?

Например
Вот делю я 12 на 13 и получаю 0.9235655246278, а нужно ровно 1
Или
23872 / 7 = 3410.2857142857, а нужно 3411
Ceil использовать нельзя. Как это сделать по другому?
#include <iostream>
using namespace std;
double fn(double num) {
auto x = static_cast<long long>(num);
if (fabs(num) - abs(x) > 1e-14) ++x;
return static_cast<double>(x);
}
int main() {
double a = 23872;
double b = 7;
auto ab = a / b;
ab = fn(ab);
cout << ab << '\n';
system("pause > nul");
}
Алексей Потапов
Алексей Потапов
62 118
Лучший ответ
можно трюк с целочисленным делением в таких случаях использовать
(12 + 13 - 1) / 13 = 2
(23872 + 7 - 1) / 7 = 3411
(не ручаюсь за отрицательные числа)
Серж Кузёмкин
Серж Кузёмкин
36 956
Ты серьёзно? Я же написал.
Преобразуешь к целому (int)number и добавляешь 1 если у числа есть дробная часть.
Шевкет Меметов
Шевкет Меметов
17 671
Дамир Кайдаров Как определить, что есть дробная часть?
Александр Дытте Все я уже все понял, спасибо:) задача решена
Нужно использовать деление с остатком. Перевести числа в целые (int). Оператор % вычисляет остаток от деления. Если остаток больше, чем половина делимого - значит, надо округлить вверх, то есть к результату деления прибавить 1.
Второй способ - тоже в целых числах. Предумножить делимое на 2, разделить на делитель. То есть, если при нормальном делении дробная часть будет больше или равна 0.5 - то с предумножением 0.5 превратится в 1. Потом проверить на чётность. Если младший бит 1 - значит число нечётное. Либо использовать остаток от деления на 2. Делим результат на 2, и если была нечётность - то прибавляем 1.
Поправка: это эмуляция round, а не ceil.
Ещё нужно обработать отрицательные числа и следить за переполнением.

Похожие вопросы