Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 366, средняя оценка - 4.81
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
#1

Округление чисел - C++

09.08.2011, 17:44. Просмотров 55841. Ответов 28

Здравствуйте! Не подскажите, как в си++ округлять числа? Дело в том, что я нашёл в справочнике Герберта Шилдта функции округления - round и trunc. Но когда я их вставил в программу, компилятор заругался. А ещё хотелось бы округлять до сотых, до тысячных и т. д. И ещё, округление типа
C++
1
2
double a=3.14;
int b=(int)a;
как происходит, отбрасыванием дробной части, или математически. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2011, 17:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Округление чисел (C++):

Округление чисел С++ - C++
Как сделать та чтоб после запятой в числе всегда било три цифри хоть ето и ноль . Например: 4.000 4.100 7.111

Не выполняется округление чисел - C++
Здравствуйте, есть код программы, которая считай ряд Тейлора, и при этом все работает, НО как только я добовляю функцию округления, все...

Программа на с\с++ (округление чисел) - C++
помогите пожалуйста, нужно написать программу которая округляет числа не используя уже встроенных в компилятор функций.

Округление дробных чисел С++ - C++
Здравствуйте, нужно округлить дробное число. Самое простое сделать вот так: float smth; smth = 345.678945; printf("%2.3f",...

printf. Округление чисел типа double - C++
Пытаюсь писать программу для округления чисел типа double. // okruglenie double.cpp: определяет точку входа для консольного...

Округление чисел при решении СЛАУ - C++
Добрый день! Подскажите, пожалуйста, программа решает систему линейных алгебраических уравнений вида AX=B методом Гаусса. Но в конце...

28
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 17:48 #2
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
как происходит
Цитата Сообщение от Виктор_Сен Посмотреть сообщение
отбрасыванием дробной части

Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Не подскажите, как в си++ округлять числа?
floor есть.
0
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
09.08.2011, 17:49 #3
(int)a отбрасыванием дробной части.
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
09.08.2011, 17:51 #4
Округление до ближайшего целого: floor(x + 0.5)
1
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
09.08.2011, 17:53 #5
Цитата Сообщение от soft.creator Посмотреть сообщение
Округление до ближайшего целого: floor(x + 0.5)
Да, но только для положительных. Для отрицательных floor(x - 0.5)
0
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
09.08.2011, 18:15 #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да, но только для положительных. Для отрицательных floor(x - 0.5)
Не согласен. x = -0.8; floor(-1.3) = -2;
Так что все-таки +0.5
1
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
09.08.2011, 18:32 #7
Цитата Сообщение от soft.creator Посмотреть сообщение
Не согласен. x = -0.8; floor(-1.3) = -2;
Так что все-таки +0.5
да, я ошибся, но не со знаком а с функцией. для отрицательных надо ceil(x - 0.5)

Добавлено через 4 минуты
floor(x + 0.5) даст неправильный результат при x = -0.5, x = -1.5 и т.д.
2
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 18:33 #8
Хм...
А static_cast<int> (x + x < 0 ? -0.5 : 0.5);
Чем не вариант?
0
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
09.08.2011, 18:36 #9
Цитата Сообщение от diagon Посмотреть сообщение
А static_cast<int> (x + x < 0 ? -0.5 : 0.5);
Вариант, но ceil и floor не делают медленного преобразования в целый тип, а такое преобразование не всегда нужно.

Добавлено через 54 секунды
правда непонятно, почему x+x
1
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 18:37 #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
ариант, но ceil и floor не делают медленного преобразования в целый тип, а такое преобразование не всегда нужно.
Хм, спасибо, не знал...


Цитата Сообщение от grizlik78 Посмотреть сообщение
правда непонятно, почему x+x
Там же выражение
Скобки поставить забыл =\
0
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
09.08.2011, 18:39 #11
По-моему имелось в виду
C++
1
static_cast<int> (x < 0 ? x - 0.5 : x + 0.5);
Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
Скобки поставить забыл =\
А, ну да, тогда я просто раскрыл забытые скобки
0
diagon
Higher
1930 / 1196 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 18:39 #12
Ну да, более читабельно, но смысл не изменился.

Цитата Сообщение от grizlik78 Посмотреть сообщение
забытые скобки
В общем-то ошибки нету, просто более читабельно.
0
grizlik78
Эксперт С++
1967 / 1460 / 120
Регистрация: 29.05.2011
Сообщений: 3,019
09.08.2011, 18:46 #13
А вообще, в C99 для этого определены функции round(), roundf(), roundl(). Только вот беда, С99 мало кем поддерживается.

Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
забытые скобки
В общем-то ошибки нету, просто более читабельно.
Как? В соответствии с приоритетом операций сначала сложение (слева), потом сравнение и только потом "?:"
1
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
09.08.2011, 19:00 #14
Цитата Сообщение от grizlik78 Посмотреть сообщение
да, я ошибся, но не со знаком а с функцией. для отрицательных надо ceil(x - 0.5)

Добавлено через 4 минуты
floor(x + 0.5) даст неправильный результат при x = -0.5, x = -1.5 и т.д.
Хм, точно. Для моих задач просто было примерно все равно, куда точно -0.5 округлится.
0
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
10.08.2011, 13:34  [ТС] #15
Итог:
1. Округлять числа отбравыванием дробной части можно так:
C++
1
2
double a=1.6;
double b=(double)(int)a;
2.Округлять числа математически можно так:
C++
1
2
double a=1.6;
double b=floor(a+0.5)
Добавлено через 15 минут
Но у 1 пункта есть недостаток: число не должно превышать диапазон значений типа int. Чтобы его обойти, можно округлять так:
C++
1
2
3
4
inline float trunc(float x)
{   
    return x<0.0f?floor(x)+1:floor(x);
}
0
10.08.2011, 13:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2011, 13:34
Привет! Вот еще темы с ответами:

Округление положительных чисел с плавающей точкой - C++
Добрый день ! Нужно округлить положительных чисел с плавающей точкой в большую сторону к числу кратному 5. то есть если есть...

Округление результата деления двух целых чисел в большую сторону с++ - C++
Существует ли стандартная функция в с++, округляющая результат деления двух целых чисел друг на друга в большую сторону? (5/2=3)

Округление - C++
Почему при таком коде: #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cmath&gt; using namespace std; int main() { cout &lt;&lt;...

Округление - C++
Привет всем.Возникла необходимость округлить число до 1000.Как это реализовать.Помогите пожалуйста.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru