round , roundf , roundl
Округляет значение с плавающей запятой до ближайшего целочисленного значения.
Синтаксис
double round( double x ); float round( float x ); // C++ only long double round( long double x ); // C++ only float roundf( float x ); long double roundl( long double x ); #define round(X) // Requires C11 or higher
Параметры
x
Округляемое значение с плавающей запятой.
Возвращаемое значение
Функции round возвращают значение с плавающей запятой, которое представляет целое число, ближайшее к x . Промежуточные значения округляются в сторону от нуля, независимо от настройки режима округления чисел с плавающей запятой. Не возвращается ошибка.
| Входные данные | Исключение SEH | Исключение _matherr |
|---|---|---|
| ± QNaN, IND | нет | _DOMAIN |
Замечания
Поскольку C++ допускает перегрузку, можно вызывать перегрузки round , которые принимают и возвращают значения float и long double . В программе C, если вы не используете макрос для вызова этой функции, round всегда принимает и возвращает значение double .
Если вы используете round макрос из , тип аргумента определяет, какая версия функции выбрана. Дополнительные сведения см . в разделе «Математика с универсальным типом».
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью «Глобальное состояние» в CRT.
Требования
| Маршрут | Обязательный заголовок |
|---|---|
| round , roundf , roundl | |
| round Макрос |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// Build with: cl /W3 /Tc // This example displays the rounded // results of floating-point values #include #include int main() < printf("===== Round a float\n\n"); float floatValue = 2.4999999f; // float stores a value close to, but not exactly equal to, the initializer below. floatValue will contain 2.5 because it is the closest single precision value printf("roundf(%.1000g) is %.1000g\n", floatValue, roundf(floatValue)); printf("roundf(%.1000g) is %.1000g\n", -floatValue, roundf(-floatValue)); // double stores a value close to, but not exactly equal to, the initializer below. The closest double value is just slightly larger. double doubleValue = 2.4999999; printf("\n===== Round a double\n\n"); printf("round(%.1000g) is %.1000g\n", doubleValue, round(doubleValue)); printf("round(%.1000g) is %.1000g\n", -doubleValue, round(-doubleValue)); // long double stores a value close to, but not exactly equal to, the initializer below. The closest long double value is just slightly larger. long double longDoubleValue = 2.4999999L; printf("\n===== Round a long double\n\n"); printf("roundl(%.1000g) is %.1000g\n", longDoubleValue, roundl(longDoubleValue)); printf("roundl(%.1000g) is %.1000g\n", -longDoubleValue, roundl(-longDoubleValue)); return 0; >
===== Round a float roundf(2.5) is 3 roundf(-2.5) is -3 ===== Round a double round(2.499999900000000163657887242152355611324310302734375) is 2 round(-2.499999900000000163657887242152355611324310302734375) is -2 ===== Round a long double roundl(2.499999900000000163657887242152355611324310302734375) is 2 roundl(-2.499999900000000163657887242152355611324310302734375) is -2
C как округлить число до сотых
проблема в том, что он не выдаст ошибку при числах 1.232 а не 1,232 (т.е. когда ставится точка, а не запятая), а также числа 1,555 округляет до 1,55(хотя при 5 он долже округлять в большую сторону).
Для Delfi код выглядит:
Edit1.Text := Round (Значение, -2); //точность до 10E-2 Edit2.Text := FormatFloat ('#.##', Значение); // для понимания форматирования см. справку
В С++ Builder функция Round не известна.
функция FormatFloat присутствует, но как ее переделат под Edit .
Нашел в нете код матиматического округления говорят работает 90%(в очень редких случаях глючит)
для работы надо подключить
#include #include
сама функция:
AnsiString TMainForm::Math_Round(double num, int precision) < char old = DecimalSeparator; DecimalSeparator = '.'; AnsiString s, number = FloatToStr(num); bool sign = false; double k = num; int pos = number.Pos('.'); int len = number.Length(); if ((pos == 0) || ((len - pos) AnsiString prom = number.SubString(1, 1); if (prom == '-') sign = true; s = number.SubString(pos + precision + 1, 1); int i = StrToInt(s); if (i >= 5)< if (sign) k = floor(num*Power(10, precision))/Power(10, precision); else k = ceil(num*Power(10, precision))/Power(10, precision); >else < if (!sign) k = floor(num*Power(10, precision))/Power(10, precision); else k = ceil(num*Power(10, precision))/Power(10, precision); >DecimalSeparator = old; return FloatToStrF(k, ffFixed, 15, precision); >
Вопрос в том, как:
1) как можно округлять числа в Edit до сотых?
2) как при наличии 5 округлять в большую сторону?
Последний раз редактировалось xxxsas; 25.01.2009 в 09:20 . Причина: находятся новые пути решения проблемы. Но все ли онит ведут к истине?
Как округлить число до сотых?

Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь?
Мне 11 лет, и я учусь программировать на С++.
У меня есть программа, которая вычисляет цену картины по её длине и ширине. Но полученную цену нужно округлить до сотых. Как это сделать?
Вот код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include int main() { double a=0, b=0, c=0; std::cout " Enter the width of the picture "; std::cin >> a; std::cout " Enter the length of the picture "; std::cin >> b; c =a*b*0.00406; std::cout " The price is " c std::endl; std::cout " press Enter. "; std::cin.get(); std::cin.get(); return 0; }
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Вычислить синус ,округлить до сотых и записать в string
Вычислить синус ,округлить до сотых и записать в string я пробовал так но не пашет,выдает 1 .
Как округлить число с 19 до 20
Вопрос в заголовке. Прошу подсказать.
как округлить число?
нужно чтобы от числа F выводило только целую часть, пример f=5.4 —>5 f=5.8 —>5 как это.
Как округлить число типо float?
Как округлить число типо float до определенного числа знаков после запятой?
57 / 51 / 42
Регистрация: 18.07.2014
Сообщений: 194
Сообщение от Kubson 
Мне 11 лет,
Можно не указывать свой возраст в каждом сообщении.
Сообщение от Kubson 
Но полученную цену нужно округлить до сотых. Как это сделать?
Можно воспользоваться setprecision( n ), где n — количество цифр после запятой.
![]()
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
double a = . a = (int)(a * 100) / 100.;
Регистрация: 17.07.2014
Сообщений: 253
Я не понимаю, куда вписывать эти две строки.
57 / 51 / 42
Регистрация: 18.07.2014
Сообщений: 194
Сообщение от Kubson 
Я не понимаю, куда вписывать эти две строки.
В моём варианте:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include int main() { double a=0, b=0, c=0; std::cout " Enter the width of the picture "; std::cin >> a; std::cout " Enter the length of the picture "; std::cin >> b; c =a*b*0.00406; std::cout " The price is " std::setprecision( 2 ) c std::endl; std::cout " press Enter. "; std::cin.get(); std::cin.get(); return 0; }
В варианте от castaway:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include int main() { double a=0, b=0, c=0; std::cout " Enter the width of the picture "; std::cin >> a; std::cout " Enter the length of the picture "; std::cin >> b; c =a*b*0.00406; c = (int)(c * 100) / 100.; std::cout " The price is " c std::endl; std::cout " press Enter. "; std::cin.get(); std::cin.get(); return 0; }
40 / 40 / 17
Регистрация: 04.02.2014
Сообщений: 144
Сообщение от porshe 
Можно воспользоваться setprecision( n )
Сообщение от castaway 
Код C++
1 double a = .
2 a = (int)(a * 100) / 100.;
Но это ведь не округление, а просто отсечение лишних цифр. Т.е. из числа, допустим, 3.0176 получим 3.01, хотя при округлении должно быть 3.02.
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
вот пример с округлением:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include #include using namespace std; int main() { double x = 23.2358; double y = 0.3412; cout setiosflags(ios::fixed) setprecision(2) x endl; // 23.236 cout setprecision(2) y endl; // 0.34 return 0; }
setiosflags(ios::fixed) — нужно для корректного вывода данного числа (в неэкспоненциальной форме)
Регистрация: 17.07.2014
Сообщений: 253
Первый вариант не правильный, в нём округляется до десятых, зато второй вариант отлично работает! Спосибо!
34 / 34 / 21
Регистрация: 02.02.2012
Сообщений: 181
Почему неправильный первый вариант? Я просто в комменте ошиблась, там выведется 23.24
![]()
4984 / 3091 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
Donnerwetter, это именно округление. В какую сторону необходимо округлять ТС не говорил.
В большую сторону:
a = (int)ceil( a * 100 ) / 100.;
2509 / 1130 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
Сообщение от castaway 
это именно округление
)
под округлением обычно понимается математическое округление, если первая отбрасываемая цифра в дробной части меньше 5 — то число округляется к ближайшему меньшему целому, если отбрасываемая цифра 5 или больше — то округляется к большему целому.
Но код совсем несложно модифицировать для такого округления:
a = (int)( a * 100 + 0.5) / 100.;
только нужно посмотреть, что будет, если а отрицательно
Регистрация: 17.07.2014
Сообщений: 253
TyLinka, я писал это не тебе, а пользователю porshe!
Добавлено через 20 минут
Не один из пока услышенных вами вариантов не был правильным! В варианте от Castaway не округляется, а отделяются две последние цифры. В варианте от TyLinka программа не запускается, у porshe округляется до десятых, а не до сотых. Помогите, пожалуйста! Мне нужно округление до сотых, в меншую сторону. Например: чтобы если пользователь ввел 55 и 20, ему выдало число 4,47. А не 4,46 как в варианте castaway.
Добавлено через 13 минут
А вот вариант Sergo Leone обсалютно правильный!
Добавлено через 1 минуту
В моей программе на экран выводится цена картины. Подскажите, пожалуйста, как сделать так, чтобы после числа выводился значок €. Например: 4,47 €. Заранее благодарю!
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как округлить число до сотых?
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Мне 11 лет, и я учусь.
Конвертер валют. Как округлить число до сотых?
Доброго времени суток! Изучаю java и столкнулся с проблемой. Суть задачи такова. Пользователь.

округлить число до сотых долей
3. x – вещественное число. Запишите выражение, которое округлит его до сотых долей (останется.
Как округлить число до десятых, или сотых, или дальше..
Собственно есть флоат число. Допустим это 78,0985321436 . надо сделать чтобы вывело 78,099.
Или воспользуйтесь поиском по форуму:
C как округлить число до сотых
Как известно, в C/C++ нет стандартного метода округления вещественных чисел до целых, и одна из типовых для начинающих программистов задач — собственная реализация такого метода, обычно называемого round . Корректно и в общем виде решить эту задачу не так легко, хотя если речь идёт просто об округлении вещественного до целого — большой проблемы нет и вполне сработает такая реализация:
//round in c++ #include #include double round (double x) < return ((x - floor(x)) >= 0.5) ? ceil(x) : floor(x); > int main() < double f[]=; //0 must be the last item for (int i=0; ;i++) < printf ("\nround(%lf)=%lf",f[i],round(f[i])); if (f[i]==0) break; >getchar(); return 0; >
Гораздо чаще проблемы вызывает округление числа до N разрядов в дробной части, так, естественно развивающая предыдущий листинг реализация округления чисел до 2 знаков в дробной части:
#include #include double round2 (double x) < double x2=x*100; return (x2 - floor(x2)>=0.5 ? ceil(x2) : floor(x2))/100; > int main() < double f[]=; //0 must be the last item //1.255 -> 1.25 - error! for (int i=0; ;i++) < printf ("\nround(%lf)=%.02lf",f[i],round2(f[i])); if (f[i]==0) break; >getchar(); return 0; >
работает некорректно (см. замечание в листинге).
В библиотеках VCL и CLX, реализующих типовые интерфейсные компоненты для GUI графических операционных систем, сохраняется та же проблема, приведём кусочек кода на C++ Builder:
void __fastcall TForm1::Button1Click(TObject *Sender) < char buffer[80]; sprintf (buffer," round(%lf)=%.02lf",1.255,round2(1.255)); Memo1->Lines->Add(AnsiString(buffer)); SetRoundMode(rmNearest); Memo1->Lines->Add(RoundTo(1.255,-2)); >
Здесь округление до 2 знаков в дробной части делается с помощью нашего показанного выше метода round2 и стандартной функции RoundTo из библиотеки VCL. Обратите внимание, что в заголовочный файл модуля *.h должна быть подключена библиотека
#include
а не сишная . По скриншоту окна приложения видно, что RoundTo тоже сработает неверно на «волшебном» числе 1.255 :
Между прочим, RoundTo считается так называмым «банкирским» округлением, а есть ещё SimpleRoundTo — обычное арифметическое округление, но оно на нашем числе работает также некорректно.
Можно попробовать в качестве альтернативы классическое
char string[20]; sprintf(string,"%.02f",var);
— после чего число содержится в Си-строке string . Увы, результат в моём C++ Builder при округлении до 2 знаков после запятой оказался столь же неверным — 1.25 вместо 1.26 .
Остаётся либо использовать непростые и платформенно-зависимые решения, как здесь, либо искать Си-среду, где округление есть и сделано без ошибки, либо, наконец, использовать «шаманские» коды:
float round(float f)
Забавно, но это работает 🙂 А вот версия для 2 разрядов после запятой, построенная на этой round ,
float round2 (float f) < // до сотых float rf = round(f); float t = (f - rf) * 100; return rf + round(t) * 0.01f; >
не смогла правильно округлить упрямое число 1.255 в стареньком Borland C++ 3.1, но в C++ Builder 6 уже сработала верно. Значит ли это, что не найдётся другого «упрямого» числа? Думаю, вопрос остаётся открытым, поищите решение, интересно.