Округление до заданного числа знаков
Часто появляется необходимость округлить вещественное число до заданного количества знаков после запятой, причём число должно остаться вещественным. Этим мы и попробуем заняться в этой статье.
Вообще, подобные процедуры лучше всего располагать в отдельных модулях или библиотеках. У каждого программиста, со временем, накапливаются большие библиотеки с подобными процедурами. Они облегчают жизнь, освобождая от необходимости писать одно и то же несколько раз. Кроме того, правильно оформленные входные параметры позволят использовать эту функцию в любом месте.
Итак, код:
- Код: Выделить всё
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
.