Перейти к содержимому
Теория · Операторы и приведение типов · урок 1 из 14

Арифметика

Чему вы научитесь

Чему вы научитесь:

  • считать остаток и округлять через %, Math.floor и Math.trunc;
  • сравнивать значения через === и объяснять, чем опасен ==;
  • выбирать одно из двух значений через &&, || и ??;
  • предсказывать, когда JavaScript сам превращает строку в число или число в строку.
Из кучки 135 минут заполнены две коробки по 60, а 15 минут остались снаружи

Арифметика в программе похожа на калькулятор со своими правилами. Он складывает, вычитает и делит как в школе, но кое в чём ведёт себя иначе. Например, он не различает целые и дробные числа.

Возьмём задачу, которая встречается постоянно: сколько часов в 135 минутах? Чтобы перевести минуты в часы, их делят на 60. Результат — 2.25, а не 2: в JavaScript у целых и дробных чисел один тип number, поэтому / сохраняет дробную часть.

JavaScript
const minutes = 135;
console.log(minutes / 60); // 2.25
console.log(Math.floor(minutes / 60)); // 2
console.log(minutes % 60); // 15
console.log(2 ** 10); // 1024

Давайте разберём программу по строкам:

  1. minutes / 60 печатает 2.25: два часа и ещё четверть часа.
  2. Math.floor(minutes / 60) отбрасывает дробь и оставляет 2, число полных часов.
  3. minutes % 60 печатает 15: столько минут не вошло в полные часы.
  4. 2 ** 10 печатает 1024.

Остаток и степень

Целую часть отдаёт Math.floor, а % даёт остаток от деления: 135 минут — это 2 часа и 15 минут. Оператор ** возводит в степень: 2 ** 10 — произведение десяти двоек.

Остаток удобно представить так. Минуты раскладывают по коробкам, и в каждую коробку помещается ровно 60 минут. Две коробки заполнились, а 15 минут не поместились ни в одну. Эти 15 минут и есть остаток.

Делить с остатком можно и дробные числа: 5.5 % 2 — это 1.5.

Порядок действий

Порядок действий тот же, что в школе:

  • сначала **;
  • затем *, / и %;
  • последними + и -.

Скобки меняют этот порядок: (2 + 3) * 4 даёт 20.

Округление

Чтобы понять округление, представьте числовую прямую: меньшие числа слева, большие справа. Два способа округления ведут себя на ней по-разному:

  • Math.floor округляет вниз, к меньшему числу, то есть всегда шагает влево;
  • Math.trunc отбрасывает дробную часть и оставляет только цифры до точки.

Для положительных чисел результат одинаковый, а для отрицательных они расходятся: Math.floor(-3.5) даёт -4, а Math.trunc(-3.5) даёт -3. Число -4 меньше, чем -3, поэтому «вниз» для Math.floor означает дальше от нуля.

Знак остатка

У остатка от % есть особенность: его знак совпадает со знаком левого числа, того, которое делят. В математике остаток не бывает отрицательным, а в JavaScript бывает:

JavaScript
console.log(-7 % 3, 7 % -3); // -1 1
console.log(253 % 10); // 3

Здесь картинка с коробками перестаёт работать: отрицательные минуты в коробку не положить, а % с ними работает, и знак берёт у делимого.

Где остаток пригодится:

  • остаток от деления положительного целого числа на 10 — его последняя цифра, как 3 у 253;
  • остаток от деления на 2 говорит о чётности: у чётного числа он 0, у нечётного 1 или -1.

На собеседованиях любят спрашивать, как проверить число на нечётность. Ловушка в знаке: -3 % 2 даёт -1, а не 1, поэтому проверка «остаток равен 1» отрицательное нечётное число пропустит.

Изменить переменную

Чтобы прибавить к переменной число, не обязательно писать её имя дважды. Запись total += 5 значит то же, что total = total + 5: как будто в копилку total кладут ещё пять монет. Это составное присваивание, и у каждого оператора оно своё: -=, *=, /=, %=.

Запись count++ прибавляет единицу, а count-- вычитает её. Увеличение на единицу называют инкрементом. Все эти записи меняют переменную, поэтому она должна быть объявлена через let.

JavaScript
let total = 10;
total += 5;
total *= 2;
total++;
console.log(total); // 31

Разберём по шагам:

  1. let total = 10 кладёт в total число 10.
  2. total += 5 прибавляет пять: теперь там 15.
  3. total *= 2 умножает на два: 30.
  4. total++ прибавляет единицу, и программа печатает 31.

Частая ошибка

Среднее двух чисел считают без скобок:

JavaScript
const a = 4;
const b = 6;
const average = a + b / 2; // ✗
console.log(average); // 7

Деление выполняется раньше сложения, поэтому программа считает 4 + 3 и печатает 7 вместо 5. Ошибки JavaScript не сообщает, и неверное число уходит дальше в вычисления. Возьмите сумму в скобки: (a + b) / 2 даёт 5.

Главное

  • / сохраняет дробную часть; Math.floor округляет вниз, а Math.trunc отбрасывает дробь.
  • % даёт остаток, и его знак совпадает со знаком делимого: -7 % 3 — это -1.
  • Сначала **, затем *, / и %, последними + и -; скобки меняют порядок.
  • += и другие составные присваивания меняют переменную на месте, а ++ прибавляет единицу.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом