Математика и сравнение
Зачем это нужно
Почти любая программа что-то считает: сумму заказа, время до конца урока, очки в игре, проценты скидки. А ещё программы постоянно сравнивают: хватает ли денег, правильный ли пароль, кончилось ли время. В этой теме — все инструменты для этого.
Арифметика
console.log(7 + 2); // 9 сложение
console.log(7 - 2); // 5 вычитание
console.log(7 * 2); // 14 умножение
console.log(7 / 2); // 3.5 деление — дробное!
console.log(7 % 2); // 1 остаток от деления
console.log(2 ** 10); // 1024 степень
Порядок действий — как в математике: сначала **, потом *, /, %, потом + и -.
Скобки меняют порядок: (2 + 3) * 4 → 20, а 2 + 3 * 4 → 14.
Остаток от деления %
Очень полезный оператор:
n % 2 === 0— число чётное;n % 10— последняя цифра числа (1234 % 10→4);total % 60— сколько минут остаётся сверх полных часов.
const seconds = 200;
console.log(Math.floor(seconds / 60), "мин", seconds % 60, "сек");
Вывод:
3 мин 20 сек
Объект Math
Math — встроенный набор математических функций:
console.log(Math.round(4.5)); // 5 по обычным правилам
console.log(Math.floor(4.9)); // 4 вниз
console.log(Math.ceil(4.1)); // 5 вверх
console.log(Math.trunc(-4.7)); // -4 отбросить дробную часть
console.log(Math.max(3, 9, 2)); // 9
console.log(Math.min(3, 9, 2)); // 2
console.log(Math.abs(-8)); // 8 модуль
console.log(Math.sqrt(81)); // 9 квадратный корень
console.log(Math.random()); // случайное от 0 до 1, например 0.4271…
Случайное целое от 1 до 6 (кубик): Math.floor(Math.random() * 6) + 1.
Дроби и точность
console.log(0.1 + 0.2);
Вывод:
0.30000000000000004
Это не ошибка JavaScript — так хранят дроби почти все языки. Для денег считают в копейках (целыми)
или округляют результат: Number((0.1 + 0.2).toFixed(2)) → 0.3. Метод toFixed(2) возвращает
строку с двумя знаками после точки.
Сравнение
Результат сравнения — логическое значение true или false:
console.log(5 > 3); // true
console.log(5 < 3); // false
console.log(5 >= 5); // true больше или равно
console.log(4 <= 3); // false меньше или равно
console.log(5 === 5); // true строго равно
console.log(5 !== 3); // true не равно
Строгое === и нестрогое ==
console.log(5 === "5"); // false — разные типы
console.log(5 == "5"); // true — == сначала приводит типы
console.log(0 == ""); // true — сюрприз!
== пытается привести значения к одному типу и даёт странные результаты. Всегда используй === и !==.
Строки сравниваются по алфавиту, точнее по кодам символов: "apple" < "banana" → true,
а "Z" < "a" → true, потому что заглавные буквы идут раньше строчных.
Как это работает внутри
Все числа в JavaScript хранятся в одном формате — 64-битной дроби (стандарт IEEE 754). Поэтому
7 / 2 даёт 3.5, а не 3, как в некоторых других языках, и поэтому 0.1 + 0.2 чуть-чуть не равно 0.3:
десятичную дробь 0.1 нельзя точно записать в двоичной системе, как 1/3 нельзя точно записать
десятичной дробью. Деление на ноль не ломает программу: 5 / 0 → Infinity.
Частые ошибки
- Ждать целого от деления.
7 / 2→3.5. Нужно целое —Math.floor(7 / 2). =вместо===.if (x = 5)не сравнивает, а присваивает. Сравнение —===.==вместо===.0 == ""→true. Пиши===.- Округление не той функцией.
Math.round— по правилам,Math.floor— вниз,Math.ceil— вверх. Для «сколько коробок нужно» —ceil, для «сколько полных часов» —floor. toFixedвозвращает строку.(1.5).toFixed(2) + 1→"1.501". Оберни вNumber(...).
Шпаргалка
| Что | Как |
|---|---|
| Действия | + - * / % ** |
| Остаток, чётность | n % 2 === 0 |
| Округления | Math.round, Math.floor, Math.ceil, Math.trunc |
| Максимум / минимум | Math.max(a, b), Math.min(a, b) |
| Модуль, корень | Math.abs(x), Math.sqrt(x) |
| Случайное | Math.random() — от 0 до 1 |
| Знаков после точки | x.toFixed(2) → строка |
| Сравнение | > < >= <= === !== |