МЕТОДЫ ОКРУГЛЕНИЯ

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


ОКРУГЛЕНИЕ К БЛИЖАЙШЕМУ ЦЕЛОМУ


Округление к ближайшему целому до N-го знака осуществляется по следующему правилу:

  • если N+1 знак < 5, то N-ый знак остается без изменений, а все знаки после N-го отбрасываются (обнуляются);
  • если N+1 знак > 5, то N-ый знак увеличивают на единицу, а все знаки после N-го отбрасываются (обнуляются).

Примеры округления до 2 знаков после запятой:

2.4545 → 2.45
2.4564 2.46

По способам округления числа в случае когда N+1 знак равен 5, выделяются следующие виды округления к ближайшему целому:

  • Математическое округление;
  • Банковское округление;
  • Случайное округление;
  • Чередующееся округление.

Математическое округление в случае если N+1 знак = 5 увеличивает N-й знак на единицу,  а все знаки после N-го отбрасываются (обнуляются). 

Пример математического округления до 2-х знаков после запятой:

2.4554 2.46

Данное округление в ABL реализовано в функции ROUND.

ROUND(iRnd, n)

  • iRnd - округляемое значение;
  • n - знак до которого осуществляется округление.

Банковское округление отличается от математического тем, что предполагает округление в таком случае к ближайшему четному числу. Т.е. результатом округления числа 2.5 при математическом округлении будет 3, а при банковском 2. 

FUNCTION BankRound RETURNS DECIMAL (INPUT iRnd AS DEC, INPUT n AS INT). 
DEF VAR ChkFor5 AS INTEGER NO-UNDO.
DEF VAR B_Round AS DECIMAL NO-UNDO.

B_Round = ROUND(iRnd,n).
ChkFor5 = ROUND(((TRUNCATE(iRnd, n + 1) -
TRUNCATE(iRnd,n)) * EXP(10, n + 1)),0).
IF ChkFor5 = 5 THEN
DO:
IF ((TRUNCATE(iRnd,n) * EXP(10,n)) MOD 2) = 0 THEN
   B_Round = TRUNCATE(i,n).
   END.
RETURN B_Round.
END FUNCTION.

Случайное округление осуществляет равновероятное округление числа 5 как в меньшую (N-ый знак остается без изменений) так и в большую (N-ый знак увеличивают на единицу) стороны. Например, в момент округления значения можно генерировать случайное целое число в пределах [0,1]. Если полученное число равно нулю, то округление осуществляется в меньшую сторону, если единице, то в большую.

FUNCTION RandomRound RETURNS DECIMAL (INPUT iRnd AS DEC, INPUT n AS INT).
DEF VAR vResult AS DECIMAL NO-UNDO.
DEF VAR ChkFor5 AS INTEGER NO-UNDO.
DEF VAR vRandom AS DECIMAL NO-UNDO.

  vRandom = RANDOM(0,1).
  vResult = TRUNCATE(iRnd,n).
  ChkFor5 = ROUND(((TRUNCATE(iRnd, n + 1) -
TRUNCATE(iRnd,n)) * EXP(10, n + 1)),0).
  IF ChkFor5 = 5 THEN vResult = vResult + vRandom * EXP(10, - n).


RETURN vResult.
END FUNCTION.

Чередующееся округление осуществляет округление числа 5 поочередно то в меньшую, то в большую стороны. Данное округление очевидно применимо при необходимости округления массива чисел, а не единичного числа.


ОКРУГЛЕНИЕ К МЕНЬШЕМУ


 


ОКРУГЛЕНИЕ К БОЛЬШЕМУ


 


ОКРУГЛЕНИЕ К БОЛЬШЕМУ ПО МОДУЛЮ



ОКРУГЛЕНИЕ К МЕНЬШЕМУ ПО МОДУЛЮ


 

Вы здесь: Главная Разное МЕТОДЫ ОКРУГЛЕНИЯ