Калькулятор выражений
БытБезопасное вычисление арифметического выражения с + − × ÷ % ^ и скобками. Без eval, без выполнения кода.
На этой странице
Что это за калькулятор?#
Это простой арифметический калькулятор, который вычисляет математическое выражение, вводимое вами как текст, — (12 * 1.08) + 7 или 2^10 % 256, — и даёт число. Никаких функциональных кнопок для поклёвки; вы пишете всё выражение целиком и нажимаете одну клавишу.
Важно то, как он устроен. Большинство быстрых калькуляторов в вебе читерят, отдавая вашу строку JavaScript-функции eval(), которая выполняет любой код — для игрушки сойдёт, уродливо становится, когда кто-то вставит что-то хитрое. Этот — нет: он запускает рукописный парсер рекурсивного спуска, принимающий только числа, скобки и операторы + - * / % ^. Всё вне этой грамматики отвергается на месте. Результат — калькулятор, который в принципе не может выполнять код, и именно поэтому в него безопасно вставлять данные.
Как пользоваться#
- Введите выражение в поле Ввод. Пробелы игнорируются, поэтому
1+2и1 + 2— одно и то же. - Операторы:
+-*/для четырёх базовых,%для остатка от деления,^для степени. Скобки()группируют. Унарный минус работает, поэтому-5 + 3— это-2. - Десятичные и научная нотация допустимы:
0.5,1e3(это 1000),2.5e-2. - Нажмите Вычислить (или Enter). Строка Результат покажет число или встроенное сообщение с именем проблемы —
Деление на ноль,Недопустимый символ,Несбалансированные скобкии так далее — чтобы вы могли исправить выражение вместо гадания, что пошло не так. - Бинарная плавающая пыль вычищается автоматически, поэтому
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), заворачивания значений в диапазон или часовой арифметики. Имеет тот же приоритет, что * и /.
Отправляется ли моё выражение на сервер?#
Нет. Разбор и вычисление происходят целиком в вашем браузере рукописным парсером — бэкенда нет, и ввод никогда не покидает страницу.