Цитата мудреца

Голосование

Что Вам нужно для счастья?
 
Система Orphus. Если вы заметили ошибку на сайте, нажмите сюда.
Загружается, подождите...
Начало сайта Материалы сайта Программы Статьи для начинающих программистов
Версия для слабовидящих
Версия для печати

Округление до заданного числа знаков

С января 2004 года журнал "Магия ПК" начал публиковать мои статьи для начинающих программистов. В них я рассказываю как прописные истины (применение различных операторов языка Паскаль), так и делюсь "секретами" (различными подходами к решению тех или иных задач).

Идея начать цикл статей посвящённых азам и секретам программирования родилась спонтанно. Один мой знакомый начал изучать программирование. Выучив несколько языков, которые требовали в институте, он так и не смог понять принцип, как же писать программы, как подойти к решению тех или иных задач. Именно для помощи в таких ситуациях, я и решил начать писать. Для этого пригодился и опыт преподавания языков программирования на компьютерных курсах (1990 г.).

Эти статьи предназначены для начинающих программистов, точнее для тех, кто решил попробовать себя в программировании. Самое первое препятствие на этом пути — страх перед трудностями, перед кажущейся сложностью процесса составления программ. Для того, чтобы помочь упростить сложные задачи — эти статьи.
  Нет сообщений • Страница 1 из 1

Округление до заданного числа знаков

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


Вообще, подобные процедуры лучше всего располагать в отдельных модулях или библиотеках. У каждого программиста, со временем, накапливаются большие библиотеки с подобными процедурами. Они облегчают жизнь, освобождая от необходимости писать одно и то же несколько раз. Кроме того, правильно оформленные входные параметры позволят использовать эту функцию в любом месте.


Итак, код:


Код: Выделить всё
uses Math;
function Reject(num: Extended; col: integer): Extended;
var
  divider: Extended;
begin
  try
    divider := IntPower(10, col);
    result := Round(num * divider) / divider;
  except
    if col > 0
      then result := num
      else result := 0;
  end;
end;

Всё выглядит достаточно просто: в качестве параметров к функции мы передаём само число num, которое необходимо округлять, и число знаков после запятой col. На выходе функции мы получаем вещественное число, округлённое до нужного количества символов после запятой.


Для выполнения поставленной задачи создадим переменную divider, которая станет делителем (множителем) для получения нужного числа. Инициализируя эту переменную, мы получаем число, равное 10col. Используем для этого функцию IntPower, которая возводит число, переданное первым параметром в степень, указанную во втором параметре. (Если col = 2, то мы получим 100). Результат же получается благодаря тому, что мы сначала умножаем исходное число на divider, получая тем самым в целой части число, сдвинутое влево на указанное количество разрядов. После этого при помощи функции Round мы округляем это число до ближайшего целого. В завершение, мы возвращаем исходное положение разрядов, деля результат на тот же divider.


Стоит заметить, что если параметр col будет отрицательным, то функция обработает заданное число в противоположном направлении: округлённое число num будет иметь col нулей в конце. (Если num = 1234,56 а col = -2, то результат будет — 1200; если, при том же значении num, col будет меньше -4, то функция вернёт 0).


Обратите внимание, что обработку параметров мы поместили в конструкцию try … except. Это сделано для того, чтобы исключить ошибки программы во время её выполнения. Ошибка может произойти, если число col будет достаточно велико, и переменная divider выйдет за допустимые границы для вещественного числа. Поместив опасные участки программы между конструкциями try и except, мы добились того, чтобы во время работы не появились неприятные сообщения о переполнении, и программа не останавливалась. Но мы должны также позаботится, чтобы наша функция, в случае возникновения исключительной ситуации вернула более-менее осмысленное значение. Обычно, когда в процессе выполнения функции происходит ошибка, функция возвращает значение, находящееся вне возможного диапазона. Например, когда нам надо подсчитать количество чего-либо, то возможный диапазон значений будет лежать в положительных целых числах, либо равняться нулю. При возникновении ошибки функция возвращает -1. При анализе результатов можно определить, что произошло что-то незапланированное. В тех случаях, когда нами вызывается процедура, т.е. она в принципе не должна возвращать никакие параметры, а просто выполнить какие-либо действия, эту процедуру всё равно оформляют в виде функции, которая возвращает логическое значение: Истина, если действие процедуры выполнено; Ложь — если она потерпела неудачу.


В нашем же случае, когда мы обязаны вернуть результат работы функции, и этот результат может лежать во всём диапазоне вещественных чисел, мы должны сами позаботиться (предугадать), какой результат нам вернуть в случае ошибки. Давайте предположим, что параметр col слишком велик и он положителен. Тогда все разряды после запятой в обрабатываемом числе должны войти в результат функции. Если же параметр col велик и отрицателен, то мы вернём 0, потому что ни один из разрядов не вошёл в результат функции и т.к. был отрезан при округлении. Эти два варианта мы реализуем при помощи конструкции if, расположенной между словами except и end.

Ответить

  Нет сообщений • Страница 1 из 1

Вернуться в Статьи для начинающих программистов



Кто сейчас на сайте

Зарегистрированные пользователи: Yandex [bot]

Где посылка отслеживание посылок ems.