МЕТОДЫ ОКРУГЛЕНИЯ
Существуют несколько методов округления числа:
- Округление к ближайшему целому;
- Округление к меньшему;
- Округление к большему;
- Округление к меньшему по модулю;
- Округление к большему по модулю.
ОКРУГЛЕНИЕ К БЛИЖАЙШЕМУ ЦЕЛОМУ
Округление к ближайшему целому до 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 поочередно то в меньшую, то в большую стороны. Данное округление очевидно применимо при необходимости округления массива чисел, а не единичного числа.
ОКРУГЛЕНИЕ К МЕНЬШЕМУ
ОКРУГЛЕНИЕ К БОЛЬШЕМУ
ОКРУГЛЕНИЕ К БОЛЬШЕМУ ПО МОДУЛЮ
ОКРУГЛЕНИЕ К МЕНЬШЕМУ ПО МОДУЛЮ