IMStrelcov
CTPEJIbLLOB
- Сообщения
- 259
- Репутация
- 66
- Версия AutoIt
- 3.3.14.5
- Версия
- 0.1
МОЖЕТ КОМУ БУДЕТ ПОЛЕЗНЫМ.
В AutoIt есть три функции для округления чисел.
Ceiling() - округление в большую сторону
Round() - округление или в большую или в меньшую сторону (авто)
Floor() - округление в меньшую сторону
Как известно функции Ceiling() и Floor() не позволяют сохранить нужное кол-во знаков после запятой,
как это делает Round().
Так вот написал функцию которая позволяет это делать,
выбирать в какую сторону округлять - в большую или в меньшую или авто
и при этом указать какое кол-во знаков после запятой сохранить.
В 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