В C++ часто требуются разные вычисления. Я уже писал об этом: арифметика в Borland C++ 3.1. Когда писал об арифметике, не знал как округлить число.
Для показанного ниже способа округления числа необходимо подключить файл math.h. Подключаются файлы с помощью ключевого слова #include.
Для использования математических функций необходимо подключать файл math.h
C++
1
2
#include <math.h> //В старом стиле, подходит и для современных компиляторов
#include <cmath> //В современных компиляторах
После подключения файла к вашему коду — появится возможность использования целого набора математических функций, которые описаны внутри подключенного файла. Среди тех функций есть несколько функций для округления чисел. Функций для округления несколько, потому что существуют разные виды округлений. Большинство из нас, полагаю, в школе знакомится только с одним из них.
Для математического округления, которому нас, наверное всех, учили, стоит использовать две функции: ceil(), floor(). Эти функции не округляют числа привычным нам, новичкам, способом, но использование их поможет нам произвести привычное округление.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Borland C++ 3.1 математическое округление Листинг #1
#include <iostream.h>
#include <math.h>
#include <conio.h>
intmain(){
clrscr();
doublevalue=-35.547;
if(value>0){
cout<<floor((value*10)+0.5)/10;
}else{
cout<<ceil((value*10)-0.5)/10;
}
cin.get();
}
В листинге #1 показан способ математического округления до десятых. Число 10 можно менять на другое, от него зависит до скольки округляем. Немного интереснее код #1 выглядит вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Borland C++ 3.1 Математическое округление Листинг #2
#include <iostream.h>
#include <math.h>
#include <conio.h>
intmain(){
clrscr();
doublevalue=-35.547;
doubledx=10;
if(value>0){
cout<<floor((value*dx)+0.5)/dx;
}else{
cout<<ceil((value*dx)-0.5)/dx;
}
cin.get();
}
Две разные функции вынуждено используются по той причине, что для отрицательных чисел округление немного иное, чем для положительных. Многие из нас знают о математическом округлении, но многие ли из вас знают правила математического округления отрицательных чисел?
В случае отрицательных чисел округление происходит по модулю
floor () — Функция, возвращающая наибольшее целое число (представленное как double), которое не больше чем округляемое ей число. Например, если дано 1.02, то функция floor() возвращает 1.0. Если задано (—1.02), то функция floor() возвращает (—2.0)
ceil () — Функция, возвращающая наименьшее целое (представленное как double), которое не меньше чем округляемое ей число. Например, если дано в качестве аргумента 1.02, то функция ceil() возвращает 2.0. Если дано (—1.02), то ceil() возвращает (—1)
Запомнить или понять, что какая функция делает, можно с помощью перевода:
floor — пол/низ
ceil — потолок/вверх
Используя перевод, вы можете легко понять направление округления.
Функции в C++ пишутся сообществом пограммистов. Вам на данной стадии обучения, вероятно, совсем необязательно знать, как устроены функции, достаточно понимать, что в функцию отдают какие-то значения, которые принимают участие в вычислениях, и что из функции можно забрать результат вычисления. Позднее вы научитесь писать собственные функции.
В этой теме вы поверхностно ознакомились с функциями, с оператором ветвления и узнали хороший способ округления чисел для приближённых вычислений, округления, знакомого нам со школы и во многом привычного. Так же вы узнали, что округления бывают разные. Надеюсь эта статья была полезной, хотя не могу детально всё расписать, несмотря на своё желание.
В действительности вам скорее всего не придётся прибегать к такому методу округления, потому что насилие чисел подобным образом иногда делает полученные результаты непригодными для дальнейшего вычисления. Чтобы не насиловать числа, а, например, выводить их, округлёнными по привычным нам правилам, на экран, следует использовать специально предназначенный манипулятор — setprecision, и флаг фиксированной формы вывода вещественных чисел — fixed:
C++
1
2
3
4
5
6
7
8
9
10
11
//Borland C++ 3.1 Форматированный вывод округление
//Листинг #3/1
#include <iostream.h>
#include <iomanip.h> //подключаем возможность использования манипуляторов
//используем манипулятор setprecision
intmain(){
cout<<ios::fixed<<setprecision(5)<<2225.9867851;
cin.get();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
//clang Форматированный вывод округление
//Листинг #3/2
#include <iostream>
#include <iomanip> //подключаем возможность использования манипуляторов
//используем манипулятор setprecision
usingnamespacestd;
intmain(){
cout<<fixed<<setprecision(5)<<2225.9867851;
cin.get();
}
fixed обозначит, что мы манипулируем не целым числом.
В setprecission отдаём число, которое обозначит число оставляемых цифр. Число отдаётся вовнутрь скобок, в листингах #3/1 и #3/2 оставляется 5 цифр. Уберите в кодах флаг fixed (ios::fixed) самостоятельно, чтобы понять, небольшое различие работы с этим флагом и без него.
Манипулятор setprecision возможно использовать, подключив файл iomanip. Запомнить название файла не очень сложно, оно говорящее: манипуляторы ввода-вывода.
Если кого-то по каким-то причинам заинтересовало насильственное округление, то для немного продвинутых новичков показываю возможность использования самописной функции. Я показываю функцию без проверок на ошибки, чтобы код не был нагромождён и нужное было наглядно видно. Показываемый ниже код может быть доработан таким образом, чтобы вместо числа, кратного десяти, подавать число, которое будет обозначать количество оставляемых цифр после запятой, это солиднее. Для этого нужно писать собственную функцию определения разряда числа. По определённым причинам, для лаконичности, я этого не делаю.
//Borland C++ 3.1 Математическое округление Листинг #4
#include <iostream>
#include <cmath>
usingnamespacestd;
/*Вы можете использовать функцию*/
doubleround(constdoublevalue,constintdx){
//dx должно быть кратно 10
if(value>0){
return(floor((value*dx)+0.5))/dx;
}else{
return(ceil((value*dx)-0.5))/dx;
}
}
intmain(){
doublevalue=-35.547;
doubledx=10;//кратное 10
round(value,dx);//Так происходит выполнение функции
/*из выполненной функции можно забрать результат*/
doublex1=round(value,dx);
doublex2=round(value,5);
doublex3=round(765.6543268,4);
//Вывод результатов, полученных с помощью функции
cout<<round(654.67654357,6)<<'\n';
cout<<x1<<'\n';
cout<<x2<<'\n';
cout<<x3<<'\n';
cin.get();
}
Использовать функцию, показанную в листинге #4 достаточно просто: округляем до десятых — отдаём вторым аргументом 10, до сотых — 100, до тысячных — 1000 и т. д. Единственное, необходимо помнить, что в компьютерах представление чисел не может быть таким, где после точки идёт бесконечное число цифр, поэтому округление числа будет происходить только до тех пор, пока числа после точки значащие, после значащих цифр пойдёт информационный мусор, который никакого значения не имеет и обработке не подлежит.
3 комментария на «“Деление чисел. C++ для начинающих. Округление числа”»
<> — это неправильно!
Целое число, если позволяет его величина, вы можете округлить до единиц,десятков,сотен и так далее.
До десятых, сотых, тысячных, и так далее вы можете округлить дробную часть числа.
Результат, который получается после операции x=floor(7/3); — это целое число (=2)
После вы делите это целое число на 100, и ничего более.Это не округление, — это обычное деление.
Ограничение времени: 1 с
Ограничение памяти: 64 M
На стандартном потоке ввода задаются 3 целых числа, не меньшие -32000 и не большие 32000. На стандартный поток вывода напечатайте сумму этих чисел.
как округление для внутренних рассчётов ваш пример корректен (например показать как быстро нарастала бы ошибка в вычислениях за счёт округлений)
но действительные типы не содержат красисывые 10-тиричные числа, там идёт дополнительное округление. если нужно вывести на экран конкрентое число десятичных знаков, то нужно использовать форматированный вывод и всё.
Здравствуйте!
<> — это правильно!
<> — это неправильно!
Целое число, если позволяет его величина, вы можете округлить до единиц,десятков,сотен и так далее.
До десятых, сотых, тысячных, и так далее вы можете округлить дробную часть числа.
Результат, который получается после операции x=floor(7/3); — это целое число (=2)
После вы делите это целое число на 100, и ничего более.Это не округление, — это обычное деление.
За сайт — спасибо!
Задача A-Сумма 3 чисел.
Задача A
Ограничение времени: 1 с
Ограничение памяти: 64 M
На стандартном потоке ввода задаются 3 целых числа, не меньшие -32000 и не большие 32000. На стандартный поток вывода напечатайте сумму этих чисел.
Это первая задача в 2010 г. Удачи!
Примеры
Входные данные Результат работы
1 2 2
5
как округление для внутренних рассчётов ваш пример корректен (например показать как быстро нарастала бы ошибка в вычислениях за счёт округлений)
но действительные типы не содержат красисывые 10-тиричные числа, там идёт дополнительное округление. если нужно вывести на экран конкрентое число десятичных знаков, то нужно использовать форматированный вывод и всё.