math
Макрос !{math} вычисляет математические выражения. Поддерживает арифметику, скобки, математические функции, константы, а также переменные и вложенные макросы.
Где используется:
- В любом тексте (сообщения, заголовки HTTP-запросов, тело запроса)
- В настройках переменных (значение для SetVarCloud / SetVarLocal)
- В условиях (для динамических диапазонов)
💡 Совет: Макрос удобен для подсчёта суммы, скидки, бонусов — любых вычислений внутри бота.
Синтаксис
!{math|выражение}
Именованных параметров у макроса нет: всё, что написано после |, целиком считается выражением.
Правила:
- Выражение может содержать числа, операторы, функции, константы, переменные
${...}и другие макросы!{...} - Пробелы и переносы строк игнорируются
- Поддерживаются скобки для изменения приоритета
- Переменные и вложенные макросы подставляются в выражение до вычисления
Примеры вызова:
!{math|2 + 2}
!{math|10 * 5 - 3}
!{math|${var.person.score} + 10}
!{math|!{random.number|min:1; max:6} * 100}
!{math|(10 + 5) * 2}
Поддерживаемые операторы
| Оператор | Описание | Приоритет | Пример | Результат |
|---|---|---|---|---|
| + | Сложение | 1 (низкий) | 5 + 3 | 8 |
| - | Вычитание | 1 (низкий) | 10 - 4 | 6 |
| * | Умножение | 2 (средний) | 4 * 3 | 12 |
| / | Деление | 2 (средний) | 15 / 3 | 5 |
| ( ) | Скобки | — | (2 + 3) * 4 | 20 |
| - | Унарный минус | — | -5 + 3 | -2 |
⚠️ Важно: Других операторов нет. Возведения в степень (
^,**) и остатка от деления (%) не существует — вместо них используйте функцииpow(основание, степень)иmod(делимое, делитель). Выражение с^или%вернёт пустой результат.
Приоритет операций
| Уровень | Операторы | Ассоциативность |
|---|---|---|
| 1 (высший) | ( ) — скобки |
Сначала вычисляется выражение в скобках |
| 2 | * / — умножение, деление |
Слева направо |
| 3 (низший) | + - — сложение, вычитание |
Слева направо |
Примеры расчёта:
| Выражение | Как вычисляется | Результат |
|---|---|---|
2 + 3 * 4 |
3*4=12, затем 2+12 | 14 |
(2 + 3) * 4 |
2+3=5, затем 5*4 | 20 |
10 - 3 - 2 |
10-3=7, затем 7-2 | 5 (слева направо) |
pow(2, 3) * 2 |
2 в степени 3 = 8, затем 8*2 | 16 |
Числа
| Тип | Описание | Пример |
|---|---|---|
| Целые числа | Целочисленные значения | 5, 42, -10 |
| Дробные числа | Числа с плавающей точкой | 3.14, 0.5, -7.25 |
⚠️ Важно: Разделитель дробной части — точка (
.), а не запятая.
Правила записи чисел:
- Целая часть обязательна:
0.5работает,.5вызовет ошибку - Экспоненциальная запись не поддерживается. Выражение
1.5e3не выдаст ошибку, но всё после числа будет отброшено, и результат окажется1.5. Большие и малые числа пишите полностью:1500,0.0000001 - Все вычисления идут с плавающей точкой, деление всегда дробное:
10 / 4даст2.5, а не2. Для целого результата используйтеfloor,truncилиround - Целые результаты выводятся без дробной части:
4, а не4.0
Математические функции
Регистр названия не важен (pow, POW, Pow — одно и то же), аргументы разделяются запятой.
| Группа | Функции |
|---|---|
| Округление | round, roundToEven, floor, ceil, trunc |
| Общие | abs, min, max, mod, remainder, dim, copySign, nextAfter, fma |
| Степени и корни | pow, sqrt, cbrt, hypot |
| Логарифмы и экспонента | exp, exp2, expm1, log, log2, log10, log1p, logb |
| Тригонометрия | sin, cos, tan, asin, acos, atan, atan2 |
| Гиперболические | sinh, cosh, tanh, asinh, acosh, atanh |
| Специальные | gamma, erf, erfc, erfInv, erfcInv, j0, j1, y0, y1, nan |
Часто используемые:
| Выражение | Описание | Результат |
|---|---|---|
pow(2, 10) |
Возведение в степень | 1024 |
sqrt(16) |
Квадратный корень | 4 |
abs(-5) |
Модуль числа | 5 |
round(2.5) |
Округление до ближайшего целого | 3 |
floor(10 / 3) |
Округление вниз | 3 |
ceil(2.1) |
Округление вверх | 3 |
min(3, 7) |
Меньшее из двух | 3 |
max(3, 7) |
Большее из двух | 7 |
mod(7, 3) |
Остаток от деления | 1 |
💡 Тригонометрические функции работают с радианами. Для градусов переводите вручную:
sin(90 * pi / 180).
Константы
Регистр не важен.
| Константа | Значение | Описание |
|---|---|---|
pi |
3.141592653589793 | Число π |
e |
2.718281828459045 | Основание натурального логарифма |
phi |
1.618033988749895 | Золотое сечение |
sqrt2 |
1.4142135623730951 | Корень из 2 |
sqrtE |
1.6487212707001282 | Корень из e |
sqrtPi |
1.772453850905516 | Корень из π |
sqrtPhi |
1.272019649514069 | Корень из φ |
ln2 |
0.6931471805599453 | Натуральный логарифм 2 |
ln10 |
2.302585092994046 | Натуральный логарифм 10 |
log2E |
1.4426950408889634 | Логарифм e по основанию 2 |
log10E |
0.4342944819032518 | Логарифм e по основанию 10 |
Пример:
!{math|2 * pi * 5} => 31.41592653589793
Использование переменных
В выражении можно использовать переменные из контекста.
Примеры:
Прибавить 10 к переменной пользователя
!{math|${var.person.score} + 10}
Вычислить скидку 15% от суммы
!{math|${var.person.amount} * 0.85}
Ограничить значение диапазоном от 0 до 100
!{math|max(0, min(100, ${var.person.score}))}
💡 Совет: Переменные должны содержать числовые значения. Если переменная пуста или содержит текст, вычисление может дать ошибку или некорректный результат.
Использование макросов внутри !{math}
Макросы можно вкладывать друг в друга. Внутренний макрос выполняется первым, его результат подставляется в выражение.
Примеры:
Случайное число от 1 до 6, умноженное на 100
!{math|!{random.number|min:1; max:6} * 100}
Текущий Unix timestamp, делённый на 3600 (часы)
!{math|!{time|value:now; output_format:unix} / 3600}
Сколько полных лет аккаунту пользователя
!{math|floor((!{time|output_format:unix} - !{tgdate|output_format:unix}) / 31557600)}
Примеры
Базовые арифметические операции
!{math|2 + 2}=> 4!{math|10 - 3}=> 7!{math|4 * 5}=> 20!{math|15 / 3}=> 5!{math|mod(10, 3)}=> 1!{math|pow(2, 3)}=> 8
Приоритет операций
!{math|2 + 3 * 4}=> 14 => Сначала умножение: 3*4=12, потом 2+12=14!{math|(2 + 3) * 4}=> 20 => Сначала скобки: 2+3=5, потом 5*4=20!{math|pow(2, 3) * 2}=> 16 => Сначала степень: 2 в степени 3 = 8, потом 8*2=16!{math|10 - 3 - 2}=> 5 => Слева направо: 10-3=7, потом 7-2=5
С переменными
Предположим, у пользователя есть переменная score = 25
!{math|${var.person.score} + 5}
Результат: 30
!{math|${var.person.score} * 2 - 10}
Результат: 40
!{math|(${var.person.score} + 10) / 5}
Результат: 7
С макросами
Случайный бонус от 1 до 10% к текущему счёту
!{math|${var.person.score} * (1 + !{random.number|min:1; max:10} / 100)}
Округлённый до целого результат деления
!{math|round(!{time|value:now; output_format:unix} / 3600)}
Ошибки и их решение
| Ошибка | Причина | Решение |
|---|---|---|
| Пустой результат | В выражении есть текст, пустая переменная или неверный синтаксис | Проверьте, что все переменные содержат числа |
| Пустой результат | Использованы ^, ** или % |
Замените на pow(...) и mod(...) |
+Inf или -Inf в тексте |
Деление на ноль | Добавьте проверку перед делением |
NaN в тексте |
Деление нуля на ноль или недопустимый аргумент функции | Проверьте входные значения |
| Неожиданно маленькое число | Использована запись вида 1.5e3 |
Пишите число полностью: 1500 |
| Результат обрезан | В выражение попал текст: 2+2abc вернёт 4 |
Проверьте подстановку переменных |
| Неверный результат | Неправильный приоритет операций | Используйте скобки для явного указания порядка |
⚠️ Параметры
defaultиerrorв этом макросе не работают: они становятся частью выражения и ломают его. Запись!{math|2+2;default:0}всегда вернёт0.
Быстрые ответы (шпаргалка)
| Нужно | Выражение |
|---|---|
| 2 + 2 | !{math|2 + 2} |
| Процент от числа | !{math|${var.person.amount} * 0.15} |
| Скидка 15% | !{math|${var.person.amount} * 0.85} |
| Возведение в степень | !{math|pow(2, 10)} |
| Остаток от деления | !{math|mod(10, 3)} |
| Целая часть от деления | !{math|floor(10 / 3)} |
| Округление | !{math|round(${var.person.score})} |
| Ограничить диапазоном | !{math|max(0, min(100, ${var.person.score}))} |
| Сложное выражение | !{math|(${a} + ${b}) * ${c}} |
| Случайный бонус | !{math|!{random.number|min:1; max:10} * 100} |