Деление чисел. C++ для начинающих. Округление числа

В C++ часто требуются разные вычисления. Я уже писал об этом: арифметика в Borland C++ 3.1. Когда писал об арифметике, не знал как округлить число.
Для показанного ниже способа округления числа необходимо подключить файл math.h. Подключаются файлы с помощью ключевого слова #include.

  • Для использования математических функций необходимо подключать файл math.h

После подключения файла к вашему коду — появится возможность использования целого набора математических функций, которые описаны внутри подключенного файла. Среди тех функций есть несколько функций для округления чисел. Функций для округления несколько, потому что существуют разные виды округлений. Большинство из нас, полагаю, в школе знакомится только с одним из них.
Для математического округления, которому нас, наверное всех, учили, стоит использовать две функции: ceil(), floor(). Эти функции не округляют числа привычным нам, новичкам, способом, но использование их поможет нам произвести привычное округление.

В листинге #1 показан способ математического округления до десятых. Число 10 можно менять на другое, от него зависит до скольки округляем. Немного интереснее код #1 выглядит вот так:


Две разные функции вынуждено используются по той причине, что для отрицательных чисел округление немного иное, чем для положительных. Многие из нас знают о математическом округлении, но многие ли из вас знают правила математического округления отрицательных чисел?

  • В случае отрицательных чисел округление происходит по модулю

    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:

fixed обозначит, что мы манипулируем не целым числом.
В setprecission отдаём число, которое обозначит число оставляемых цифр. Число отдаётся вовнутрь скобок, в листингах #3/1 и #3/2 оставляется 5 цифр. Уберите в кодах флаг fixed (ios::fixed) самостоятельно, чтобы понять, небольшое различие работы с этим флагом и без него.

Манипулятор setprecision возможно использовать, подключив файл iomanip. Запомнить название файла не очень сложно, оно говорящее: манипуляторы ввода-вывода.
Если кого-то по каким-то причинам заинтересовало насильственное округление, то для немного продвинутых новичков показываю возможность использования самописной функции. Я показываю функцию без проверок на ошибки, чтобы код не был нагромождён и нужное было наглядно видно. Показываемый ниже код может быть доработан таким образом, чтобы вместо числа, кратного десяти, подавать число, которое будет обозначать количество оставляемых цифр после запятой, это солиднее. Для этого нужно писать собственную функцию определения разряда числа. По определённым причинам, для лаконичности, я этого не делаю.


Использовать функцию, показанную в листинге #4 достаточно просто: округляем до десятых — отдаём вторым аргументом 10, до сотых — 100, до тысячных — 1000 и т. д. Единственное, необходимо помнить, что в компьютерах представление чисел не может быть таким, где после точки идёт бесконечное число цифр, поэтому округление числа будет происходить только до тех пор, пока числа после точки значащие, после значащих цифр пойдёт информационный мусор, который никакого значения не имеет и обработке не подлежит.

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

7 комментариев: Деление чисел. C++ для начинающих. Округление числа

  • Иван говорит:

    Здравствуйте!
    <> — это правильно!

    <> — это неправильно!
    Целое число, если позволяет его величина, вы можете округлить до единиц,десятков,сотен и так далее.
    До десятых, сотых, тысячных, и так далее вы можете округлить дробную часть числа.
    Результат, который получается после операции x=floor(7/3); — это целое число (=2)
    После вы делите это целое число на 100, и ничего более.Это не округление, — это обычное деление.

    За сайт — спасибо!

  • Иван говорит:

    Округление произошло, когда вы применили floor() , как вы написали — 2) Округление до наибольшего целого, не больше чем округляемое число. Но функция floor(x) НЕ отбрасывает дробную часть.Пример floor(-7.3)=-8. Если бы мы отбрасывали дробную часть, то было бы -7,что неправильно. Это округление в меньшую сторону (floor, с английского — пол, дно,минимальный уровень)
    Округление также произошло, когда вы применили ceil()) , как вы написали — 1) Округление до наименьшего целого, не меньше чем округляемое число.Это округление в большую сторону(ceil, с английского — перекрывать, покрывать,(потолок))

    Автор сайта отвечает:
    Спасибо. Косяк исправлен.

    Во втором примере cout<<x; не лишнее?

    Автор сайта отвечает:
    да, было лишним

  • Аноним говорит:

    Написать программу по С++. Задача такое!
    Библиотечная функция islower() принимает качестве аргумента один символ (букву) и возвращает ненулевое целое значение в том случае, если буква является строчной, и нулевое, если буква является заглавной. Написать программу, которая принмает букву от пользователя, а затем выводит нулевое или ненулевое значение в зависимости от того, является ли буква строчной или нет.

    Автор сайта отвечает:
    есть замечательные форумы
    http://www.cyberforum.ru/cpp-beginners/
    http://forum.vingrad.ru/forum/C++C.html
    http://forum.sources.ru/index.php?showforum=2
    и другие иже с ними
    ==============
    Там такие задачи чуть ли не каждый день решают. Если вы хотите учиться и ищите знаний — вы попали туда, если вы хотите, чтобы все вам за вас делали — удачи.

  • Никита говорит:

    Задача A-Сумма 3 чисел.

    Задача A

    Ограничение времени: 1 с
    Ограничение памяти: 64 M
    На стандартном потоке ввода задаются 3 целых числа, не меньшие -32000 и не большие 32000. На стандартный поток вывода напечатайте сумму этих чисел.

    Это первая задача в 2010 г. Удачи!

    Примеры

    Входные данные Результат работы
    1 2 2
    5

  • Yayayaya говорит:

    А переменную x ненадо объявлять?

    Автор сайта отвечает:
    вы о чем?

  • Максим говорит:

    как округление для внутренних рассчётов ваш пример корректен (например показать как быстро нарастала бы ошибка в вычислениях за счёт округлений)

    но действительные типы не содержат красисывые 10-тиричные числа, там идёт дополнительное округление. если нужно вывести на экран конкрентое число десятичных знаков, то нужно использовать форматированный вывод и всё.

  • Алексей говорит:

    int main ()
    {
    clrscr();
    double a=10,b=3; //ТИП НЕ INT
    cout<<ceil(100*(a/b))/100.0; //Присваиваем в x число равное a/b и округляем его до сотых
    getch(); //Ожидаем нажатие любой клавиши
    return 0; //Заканчиваем программу и выходим из функции
    }

    При делении 10 на 3 ответ 3,34, а обычный калькулятор выдает 3,33. Почему так?
    p.s. Спасибо за Ваш сайт!

    Автор сайта отвечает:
    некоторое время сайт не работал(
    Вам нужно прочитать про округления. Они разные бывают. Мы со школы привыкли к округлению где привязка идет к 5 десятым, но ceil немного по другому округляет. ceil округляет до ближайшего равного или большего числа.
    т.е. округление 3.01 до десятых даст 3,1 (потому как 3.0<3.01, а округление идет только до равного или большего числа). Так сказать: "Округление наперед". ceil захватывает только и только впереди идущее число.

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

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Приходит программер в магазин. Подходит к витрине, хочет достать еды, но не может и говорит: - Rеаd оnlу, однако...

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок