Инструменты
Руководства

Калькулятор выражений

Быт

Безопасное вычисление арифметического выражения с + − × ÷ % ^ и скобками. Без eval, без выполнения кода.

100 % на клиенте Без бэкенда
Поддерживает + − * / % ^ и (). Enter для вычисления.
Результат —
На этой странице

Что это за калькулятор?#

Это простой арифметический калькулятор, который вычисляет математическое выражение, вводимое вами как текст, — (12 * 1.08) + 7 или 2^10 % 256, — и даёт число. Никаких функциональных кнопок для поклёвки; вы пишете всё выражение целиком и нажимаете одну клавишу.

Важно то, как он устроен. Большинство быстрых калькуляторов в вебе читерят, отдавая вашу строку JavaScript-функции eval(), которая выполняет любой код — для игрушки сойдёт, уродливо становится, когда кто-то вставит что-то хитрое. Этот — нет: он запускает рукописный парсер рекурсивного спуска, принимающий только числа, скобки и операторы + - * / % ^. Всё вне этой грамматики отвергается на месте. Результат — калькулятор, который в принципе не может выполнять код, и именно поэтому в него безопасно вставлять данные.

Как пользоваться#

  1. Введите выражение в поле Ввод. Пробелы игнорируются, поэтому 1+2 и 1 + 2 — одно и то же.
  2. Операторы: + - * / для четырёх базовых, % для остатка от деления, ^ для степени. Скобки ( ) группируют. Унарный минус работает, поэтому -5 + 3 — это -2.
  3. Десятичные и научная нотация допустимы: 0.5, 1e3 (это 1000), 2.5e-2.
  4. Нажмите Вычислить (или Enter). Строка Результат покажет число или встроенное сообщение с именем проблемы — Деление на ноль, Недопустимый символ, Несбалансированные скобки и так далее — чтобы вы могли исправить выражение вместо гадания, что пошло не так.
  5. Бинарная плавающая пыль вычищается автоматически, поэтому 0.1 + 0.2 покажет 0.3, а не 0.30000000000000004.

Ключевые возможности#

  • Никакого eval, никакого new Function, никаких идентификаторов. Принимаются только числа и семь операторных символов — полностью ограниченная грамматика, а не выполнение произвольного кода.
  • Корректный приоритет операторов (PEMDAS): скобки, затем ^, затем * / %, затем + -.
  • Правоассоциативная степень. 2^3^2 вычисляется так, как пишут математики (см. разбор примера).
  • Научная нотация (6.022e23) и остаток от деления (17 % 5) для настоящих прикидок на обороте конверта.
  • Понятные, конкретные ошибки, называющие сбой (деление на ноль, обрезанное выражение, плохое число) с позицией виновника, а не молчаливый NaN.

Разбор примера#

Три выражения, каждое показывает разное поведение. Вставляйте по одному.

Приоритет операторов и группировка.

(1 + 2) * 3 ^ 2

Результат: 27. Скобки форсируют сначала 1 + 2 = 3; затем 3 ^ 2 вычисляется перед умножением (степень связывает теснее, чем *), давая 9; наконец 3 * 9 = 27. Без скобок 1 + 2 * 3 ^ 2 было бы 1 + 18 = 19.

Правоассоциативная степень.

2 ^ 3 ^ 2

Результат: 512, а не 64. Степень ассоциируется вправо, поэтому это 2 ^ (3 ^ 2) = 2 ^ 9 = 512. Если вам нужно было (2 ^ 3) ^ 2 = 64, напишите скобки.

Бинарная пыль удалена.

0.1 + 0.2

Результат: 0.3. «Сырая» бинарная плавающая сумма — 0.30000000000000004; форматтер округляет её обратно до разумного числа значащих цифр, поэтому ответ читается так, как ожидает человек.

FAQ#

Почему нельзя использовать sin, log, sqrt или pi?#

Потому что это идентификаторы, а идентификаторы намеренно не входят в грамматику. Каждое имя отвергается как «недопустимый символ» — это та линия, что не даёт калькулятору выполнять код. Если нужно sqrt(16), перепишите как 16 ^ 0.5; для log и sin возьмите инженерный калькулятор.

2^3^2 даёт 512 или 64?#

512. Оператор ^ правоассоциативен, что соответствует соглашению в математике и в операторе степени большинства языков программирования. 2^3^2 разбирается как 2^(3^2). Чтобы получить 64, напишите (2^3)^2.

Что здесь делает оператор %?#

Это остаток от деления — остаток от целочисленного деления, — а не «процент». 17 % 5 равно 2, потому что 17 при делении на 5 даёт остаток 2. Удобно для проверки «чётное ли число?» (n % 2), заворачивания значений в диапазон или часовой арифметики. Имеет тот же приоритет, что * и /.

Отправляется ли моё выражение на сервер?#

Нет. Разбор и вычисление происходят целиком в вашем браузере рукописным парсером — бэкенда нет, и ввод никогда не покидает страницу.