- Вычисление остатка от деления в JavaScript
- 4 ответа 4
- JavaScript. Остаток от деления и деление без остатка
- Остаток от деления (деление по модулю)
- Деление без остатка
- Задача. Функция для определения простого числа
- Ваши вопросы и комментарии:
- Свежие записи
- Арифметические операторы
- Перечень математических операторов
- Оператор сложения (+)
- Remainder (%)
- Try it
- Syntax
- Description
- Examples
- Remainder with positive dividend
Вычисление остатка от деления в JavaScript
Непонятно, кто сможет объяснит? В последнее время встречаю подобное для вычислений и сам уже использую, но как это работает не могу понять.
@Санаев «в интернете полно объяснений» — как мне кажется, без ссылки на источник в Интернет, Ваш комментарий мягко говоря — бесполезен.
@mymedia: первая редакция о javascript спрашивает. Поведение % разни́тся между языками программирования и не такое очевидное как может показаться. Посмотрите ссылки из моих комментариев.
4 ответа 4
Оператор % работает как нормальный оператор возвращающий остаток от деления. При a % b a делится нацело на b и все что остается возвращается. Числа 1, 2, и 3 меньше 7, поэтому нацело они на 7 не делятся (результат их деления на 7 нацело равен нулю) и в остатке остаются сами числа
1 % 7 = ноль целых и один в остатке 2 % 7 = ноль целых и два в остатке 3 % 7 = ноль целых и три в остатке
@RiseUp: если хотите снова запутаться, то попробуйте отрицательные числа ( % операция является взятием остатка в Питоне ( 0
@RiseUp: чтобы получить остаток и в Си, можно (b + (a % b)) % b формулу использовать. См. Деление с остатком, Euclidean division
@jfs, благодарю за восстановление математической справедливости. Если не секрет — а исторически, кто у программистов придумал считать остатки от отрицательных чисел отрицательными и зачем?
@АлександрБелинский значение a%b следует из свойств a/b . До C99 a/b зависело от реализации. C99 к нулю округляет потому что Fortran так делал, который вероятно в свою очередь использовал то что на CPU быстрее (про Фортран—со слов человека, который черновик стандарта правил
JavaScript. Остаток от деления и деление без остатка
В этом посте мы рассмотрим как получить остаток и целое от деления в JS.
Остаток от деления (деление по модулю)
Чтобы получить остаток от деления мы можем воспользоваться оператором %
console.log(20 % 3) // 2 (3 * 6 = 18)
Как видно из примера, мы получим 2 — это и будет остаток от деления.
Где такое может понадобиться? Как пример, если в цикле вы будете генерировать строки таблицы и каждую 3 строку вам нужно будет стилизовать:
В данном примере показана каждая третья строка, но можно также сделать и с другим числом:
if (i % 2 === 0) — каждая вторая строка
if (i % 5 === 0) — каждая пятая строка
if (i % 10 === 0) — каждая 10я строка и т.д.
Другой пример, когда вам нужно проверить делимость числа например на 10 и 100 без остатка:
if (num % 10 === 0 && num % 100 === 0)
Деление без остатка
Чтобы получить целое число от деления можно использовать несколько вариантов.
Первый вариант, наиболее очевидный, это округление числа после операции деления:
let num1 = 10, num2 = 3; console.log(Math.floor(num1/num2)); // 3 (округление в меньшую сторону) console.log(Math.ceil(num1/num2)); // 4 (округление в большую сторону) console.log(Math.round(num1/num2)); // 3 (математическое округление) console.log(+(num1/num2).toFixed(0)); // 3 (математическое округление) console.log(parseInt((num1/num2))); // 3 (приведение к числу, будет отброшена дробная часть)
Подробнее про разные способы округления чисел (в меньшую и в большую сторону) можете прочитать по ссылке.
Еще один вариант, предложенный пользователем в комментариях:
Также есть другие варианты, с использованием битовых операций:
let num1 = 10, num2 = 3; console.log((num1/num2) | 0); // 3 console.log((num1/num2) >> 0); // 3
Задача. Функция для определения простого числа
Давайте теперь на примере посмотрим, как можно использовать остаток от деления для решения такой задачи. Простое число: это положительное число, которое делиться только на самого себя и на 1.
Итак, напишем функцию, которая на вход принимает какое-то число, дальше в цикле начиная с 2 (т.к. на единицу итак все делиться), пока счетчик меньше передаваемого числа, проверяем будет ли num делиться без остатка. Если делиться, значит num не является простым числом:
function isPrime(num) < for (let i = 2; i < num; i++) < if (num % i === 0) < return false; >> return num > 1; > console.log(isPrime(1)); // false console.log(isPrime(2)); // true console.log(isPrime(3)); // true console.log(isPrime(4)); // false console.log(isPrime(5)); // true
Ваши вопросы и комментарии:
Свежие записи
Копирование материалов разрешено только с ссылкой на источник Web-Dev.guru
2023 © Все права защищены.
Арифметические операторы
Осваивайте профессию, начните зарабатывать, а платите через год!
Курсы Python Акция! Бесплатно!
Станьте хакером на Python за 3 дня
Веб-вёрстка. CSS, HTML и JavaScript
Станьте веб-разработчиком с нуля
Арифметические операторы принимают в качестве операндов числовые значения, выполняют с ними математические операции и возвращают результат в виде одного числового значения. Стандартные операторы — это сложение + , вычитание — , деление / , умножение * , деление с возвратом остатка % .
Перечень математических операторов
Арифметические (математические) операторы выполняют математические операции над операндами и возвращают результат. В JavaScript они такие же, как и в большинстве других языков программирования:
Оператор | Описание | Пример |
---|---|---|
+ | Сложение | var x = 20 + 10; alert( x ); // 30 |
— | Вычитание | var x = 20 — 10; alert( x ); // 10 |
* | Умножение | var x = 20 * 10; alert( x ); // 200 |
/ | Деление | var x = 20 / 10; alert( x ); // 2 |
% | Деление по модулю | var x = 5 % 2; alert( x ); // 1 |
++ | Инкремент | var x = 10; x ++; alert( x ); // 11 |
— | Декремент | var x = 10; x—; alert( x ); // 9 |
Оператор сложения (+)
Бинарный оператор + возвращает сумму двух операндов, если они числовые. Возвращаемый результат будет формироваться по следующим правилам:
Слагаемые операнды | Результат |
---|---|
Один из слагаемых операндов — значение NaN | NaN |
Суммируются операнды Infinity и Infinity | Infinity |
Суммируются операнды -Infinity и -Infinity | -Infinity |
Суммируются операнды Infinity и -Infinity | NaN |
Суммируются операнды +0 и +0 | +0 |
Суммируются операнды -0 и +0 | +0 |
Суммируются операнды -0 и -0 | -0 |
Если одним из операндов является строка, другой операнд автоматически преобразуется в строку и выполняется конкатенация (склеивание строк):
Remainder (%)
The remainder ( % ) operator returns the remainder left over when one operand is divided by a second operand. It always takes the sign of the dividend.
Try it
Syntax
Description
The % operator is overloaded for two types of operands: number and BigInt. It first coerces both operands to numeric values and tests the types of them. It performs BigInt remainder if both operands becomes BigInts; otherwise, it performs number remainder. A TypeError is thrown if one operand becomes a BigInt but the other becomes a number.
For the operation n % d , n is called the dividend and d is called the divisor. The operation returns NaN if one of the operands is NaN , n is ±Infinity, or if d is ±0. Otherwise, if d is ±Infinity or if n is ±0, the dividend n is returned.
When both operands are non-zero and finite, the remainder r is calculated as r := n — d * q where q is the integer such that r has the same sign as the dividend n while being as close to 0 as possible.
Note that while in most languages, ‘%’ is a remainder operator, in some (e.g. Python, Perl) it is a modulo operator. Modulo is defined as k := n — d * q where q is the integer such that k has the same sign as the divisor d while being as close to 0 as possible. For two values of the same sign, the two are equivalent, but when the operands are of different signs, the modulo result always has the same sign as the divisor, while the remainder has the same sign as the dividend, which can make them differ by one unit of d . To obtain a modulo in JavaScript, in place of n % d , use ((n % d) + d) % d . In JavaScript, the modulo operation (which doesn’t have a dedicated operator) is used to normalize the second operand of bitwise shift operators ( > , etc.), making the offset always a positive value.
For BigInt division, a RangeError is thrown if the divisor y is 0n . This is because number remainder by zero returns NaN , but BigInt has no concept of NaN .
Examples
Remainder with positive dividend
13 % 5; // 3 1 % -2; // 1 1 % 2; // 1 2 % 3; // 2 5.5 % 2; // 1.5 3n % 2n; // 1n