Что нового

Математика Round(), Ceiling(), Floor()

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Версия AutoIt
3.3.14.5
Версия
0.1
МОЖЕТ КОМУ БУДЕТ ПОЛЕЗНЫМ.

В AutoIt есть три функции для округления чисел.
Ceiling() - округление в большую сторону
Round() - округление или в большую или в меньшую сторону (авто)
Floor() - округление в меньшую сторону
Как известно функции Ceiling() и Floor() не позволяют сохранить нужное кол-во знаков после запятой,
как это делает Round().
Так вот написал функцию которая позволяет это делать,
выбирать в какую сторону округлять - в большую или в меньшую или авто
и при этом указать какое кол-во знаков после запятой сохранить.

Код:
ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s','','Сколько','','Результат','Результат')& @LF)
ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s','Число','знаков','В какую','новой','Ceiling()')& @LF)
ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s','которое','оставить','сторону','функции','Round()')& @LF)
ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s','округляем','после .','округлить','Round_()','Floor()')& @LF& @LF)

Global $aNumChar[15] = [1,0,2,2,2,2,2,0,0,0,0,1,1,2,2]
Global $aValue[15] = [0.005,0.015,1,0.004,0.005,0.014,0.015,0.4,0.5,1.4,1.5,0.04,0.05,0.4,0.5]

For $iA=0 To 14
   ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s', $aValue[$iA], $aNumChar[$iA], 'в большую', Round_($aValue[$iA], $aNumChar[$iA], '+'), Ceiling($aValue[$iA]))& @LF)
   ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s', $aValue[$iA], $aNumChar[$iA], 'авто', Round_($aValue[$iA], $aNumChar[$iA], ''), Round($aValue[$iA], $aNumChar[$iA]))& @LF)
   ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s', $aValue[$iA], $aNumChar[$iA], 'в меньшую', Round_($aValue[$iA], $aNumChar[$iA], '-'), Floor($aValue[$iA]))& @LF& @LF)
   $aValue[$iA] = 0 -$aValue[$iA]
   ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s', $aValue[$iA], $aNumChar[$iA], 'в большую', Round_($aValue[$iA], $aNumChar[$iA], '+'), Ceiling($aValue[$iA]))& @LF)
   ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s', $aValue[$iA], $aNumChar[$iA], 'авто', Round_($aValue[$iA], $aNumChar[$iA], ''), Round($aValue[$iA], $aNumChar[$iA]))& @LF)
   ConsoleWrite(StringFormat('%-12s%-12s%-12s%12s%12s', $aValue[$iA], $aNumChar[$iA], 'в меньшую', Round_($aValue[$iA], $aNumChar[$iA], '-'), Floor($aValue[$iA]))& @LF& @LF)
Next

; #FUNCTION# ====================================================================================================================
;
; Name...........: Round_()
;
; Description ...: позволяет круглять числа в большую, в меньшую сторону или авто
;                  и при этом указать какое кол-во знаков после запятой сохранить
;
; Syntax.........: Round_($iValue [, $iNumChar [, $sSide ]])
;
; Parameters ....: $iValue =   число которое нужно округлить
;                              Может быть как положительным, так и отрицательным
;
;                  $iNumChar = сколько знаков после запятой сохранить
;                              любое положительное число
;
;                  $sSide =    в какую сторону округлить
;                              знак минус или число меньшее нуля - округлить в меньшую сторону
;                              пустая строка или ноль            - округлить в сторону выбранную автоматически
;                              знак плюс или число большее нуля  - округлить в большую сторону
;
; Return values .: возращает округленное число
;
; ===============================================================================================================================
Func Round_($_iValue, $_iNumChar = 0, $_sSide = 0)
   If Not StringRegExp($_iNumChar, '^[0-9]+$') Then $_iNumChar = 0
   Local $_aValue = StringRegExp($_iValue, '([^0-9]*)([0-9]+)(?:[^0-9]*)([0-9]{0,'& $_iNumChar& '})([0-9]*)', 3)
   If @error Or (Not $_aValue[3]) Then Return $_iValue
   $_aValue[0] = ($_aValue[0] = '-') ? '-' : ''
   If Not StringRegExp($_sSide, '^(-|\+)?[0-9]+$') Then $_sSide = ($_sSide = '-') ? -1 : ($_sSide = '+') ? 1 : 0
   $_aValue[3] = ($_sSide > 0) ? (Not $_aValue[0]) : ($_sSide < 0) ? ($_aValue[0] <> '') : Round('0.'& $_aValue[3])
   $_aValue[3] = $_iNumChar ? '0.'& StringFormat('%0'& $_iNumChar - 1& 's', '')& Number($_aValue[3]) : $_aValue[3]
   $_aValue[1] = ($_aValue[1]& '.'& $_aValue[2]) + $_aValue[3]
   Return Number($_aValue[0]& $_aValue[1])
EndFunc
 
Верх