Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/340: Рейтинг темы: голосов - 340, средняя оценка - 4.61
Виктор_Сен
33 / 26 / 2
Регистрация: 01.08.2011
Сообщений: 176
#1

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

09.08.2011, 17:44. Просмотров 62176. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

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

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


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

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

Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
забытые скобки
В общем-то ошибки нету, просто более читабельно.
Как? В соответствии с приоритетом операций сначала сложение (слева), потом сравнение и только потом "?:"
1
soft.creator
104 / 104 / 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
Виктор_Сен
33 / 26 / 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
grizlik78
Эксперт С++
1984 / 1477 / 191
Регистрация: 29.05.2011
Сообщений: 3,053
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
Виктор_Сен
33 / 26 / 2
Регистрация: 01.08.2011
Сообщений: 176
10.08.2011, 13:50  [ТС] #17
Да, но у меня почему-то на trunc() компилятор ругается. Компилятор Микрософт.
0
grizlik78
Эксперт С++
1984 / 1477 / 191
Регистрация: 29.05.2011
Сообщений: 3,053
10.08.2011, 13:56 #18
Виктор_Сен, а зачем второе сравнение? Чем мой вариант плох?
0
Виктор_Сен
33 / 26 / 2
Регистрация: 01.08.2011
Сообщений: 176
10.08.2011, 14:02  [ТС] #19
grizlik78, твой вариант логичнее. Я немного напутал.
0
SLASTY_73
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 22
24.09.2013, 22:15 #20
помогите пожалуйста,мне нужно написать программу которая бы находила абсолютную погрешность каждого числа,затем выполняла цепочку действий с ними и округляла их до двух значащих цифр в числе...
0
24.09.2013, 22:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2013, 22:15

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

Округление чисел при решении СЛАУ
Добрый день! Подскажите, пожалуйста, программа решает систему линейных...

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


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

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

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