Перейти к содержимому

C как округлить число до сотых

  • автор:

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 . Причина: находятся новые пути решения проблемы. Но все ли онит ведут к истине?

Как округлить число до сотых?

Author24 — интернет-сервис помощи студентам

Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь?
Мне 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 уже сработала верно. Значит ли это, что не найдётся другого «упрямого» числа? Думаю, вопрос остаётся открытым, поищите решение, интересно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *