36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
1

Округление чисел

09.08.2011, 17:44. Показов 111058. Ответов 28

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

Округление чисел в C++
Возник вопрос в округлении, сама задача довольно простая но справиться с помощью гугла не...

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

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

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

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

Цитата Сообщение от Виктор_Сен Посмотреть сообщение
Не подскажите, как в си++ округлять числа?
floor есть.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
09.08.2011, 17:49 3
(int)a отбрасыванием дробной части.
0
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
09.08.2011, 17:51 4
Округление до ближайшего целого: floor(x + 0.5)
1
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
09.08.2011, 17:53 5
Цитата Сообщение от soft.creator Посмотреть сообщение
Округление до ближайшего целого: floor(x + 0.5)
Да, но только для положительных. Для отрицательных floor(x - 0.5)
0
106 / 106 / 11
Регистрация: 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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.08.2011, 18:33 8
Хм...
А static_cast<int> (x + x < 0 ? -0.5 : 0.5);
Чем не вариант?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
09.08.2011, 18:36 9
Цитата Сообщение от diagon Посмотреть сообщение
А static_cast<int> (x + x < 0 ? -0.5 : 0.5);
Вариант, но ceil и floor не делают медленного преобразования в целый тип, а такое преобразование не всегда нужно.

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


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

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

Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
забытые скобки
В общем-то ошибки нету, просто более читабельно.
Как? В соответствии с приоритетом операций сначала сложение (слева), потом сравнение и только потом "?:"
1
106 / 106 / 11
Регистрация: 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
36 / 29 / 2
Регистрация: 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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
10.08.2011, 13:37 16
Тогда уж так логичнее будет:
C++
1
2
3
4
inline float truncf(float x)
{       
        return x < 0.0f ? ceilf(x) : floorf(x);
}
В С99 и такая функция определена, с именами trunc(), truncf(), truncl()
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
10.08.2011, 13:50  [ТС] 17
Да, но у меня почему-то на trunc() компилятор ругается. Компилятор Микрософт.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
10.08.2011, 13:56 18
Виктор_Сен, а зачем второе сравнение? Чем мой вариант плох?
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
10.08.2011, 14:02  [ТС] 19
grizlik78, твой вариант логичнее. Я немного напутал.
0
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 22
24.09.2013, 22:15 20
помогите пожалуйста,мне нужно написать программу которая бы находила абсолютную погрешность каждого числа,затем выполняла цепочку действий с ними и округляла их до двух значащих цифр в числе...
0
24.09.2013, 22:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2013, 22:15
Помогаю со студенческими работами здесь

Округление дробных чисел С++
Здравствуйте, нужно округлить дробное число. Самое простое сделать вот так: float smth;...

Округление дробных чисел
Напишите программу, которая будет округлять до десятых, сотых и тысячных число... к примеру:...

Округление вещественных чисел
Наткнулся на задачу,не могу решить.Помогите пж Надо написать программу которое округляет...

Некорректный ввод чисел(округление)
Самый простой ввод числа:cin &gt;&gt; temp; При вводе &quot;3.01&quot; - temp=3.0999..98, что рушит все...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru