14

Как выполнить целочисленное деление и отдельно получить остаток в JavaScript?

10

Заголовок: Как в JavaScript получить целую часть от деления и остаток от деления?

Описание проблемы:

В JavaScript мне нужно решить задачу, связанную с делением двух целых чисел. Конкретно, я хочу получить:

  1. Целую часть от деления одного целого числа на другое.
  2. Остаток от этого деления.

Как правильно сделать это в JavaScript? Буду благодарен за пример кода и объяснение используемых методов.

5 ответ(ов)

18

Для вычисления частного и остатка от деления некоторого числа y на делитель x можно использовать следующий подход на JavaScript:

const quotient = Math.floor(y / x);
const remainder = y % x;

Пример:

Предположим, у нас есть y = 13 и x = 3. Мы можем вычислить значения так:

const quotient = Math.floor(13 / 3); // => 4, ведь 3 помещается в 13 4 раза 
const remainder = 13 % 3;            // => 1, остаток от деления

Таким образом, quotient будет равен 4, а remainder — 1. Это означает, что 3 помещается в 13 четыре раза, оставляя остаток 1.

3

Я провел тесты скорости в Firefox и вот результаты:

-100/3             // -33.33..., 0.3663 мс
Math.floor(-100/3) // -34,       0.5016 мс
~~(-100/3)         // -33,       0.3619 мс
(-100/3>>0)        // -33,       0.3632 мс
(-100/3|0)         // -33,       0.3856 мс
(-100-(-100%3))/3  // -33,       0.3591 мс

/* a=-100, b=3 */
a/b                // -33.33..., 0.4863 мс
Math.floor(a/b)    // -34,       0.6019 мс
~~(a/b)            // -33,       0.5148 мс
(a/b>>0)           // -33,       0.5048 мс
(a/b|0)            // -33,       0.5078 мс
(a-(a%b))/b        // -33,       0.6649 мс

Эти результаты основаны на 10 миллионах испытаний для каждого варианта.

Вывод: Используйте (a/b>>0), (~~(a/b)) или (a/b|0), чтобы добиться примерно 20% увеличения производительности. Также учтите, что все они ведут себя непоследовательно по сравнению с Math.floor, когда a/b<0 && a%b!=0.

0

Вы можете использовать следующий код для вычисления частного и остатка от деления:

const quotient = (a - a % b) / b;
const remainder = a % b;

Хотя это и не самый элегантный способ, он вполне работоспособен. Если вам важно получить более чистое решение, то можно воспользоваться встроенной функцией Math.floor для получения частного:

const quotient = Math.floor(a / b);
const remainder = a % b;

Этот метод также корректно работает и может сделать код немного более понятным.

0

Ваш код выполняет операцию деления x на y с округлением вниз. Давайте разберём его строка за строкой:

  1. var remainder = x % y; - здесь мы вычисляем остаток от деления x на y. Это значение будет представлять собой то, что остаётся после деления.

  2. return (x - remainder) / y; - в этой строке мы сначала вычитаем остаток из x, тем самым получая наибольшее число, которое делится на y без остатка. Затем мы делим эту разницу на y, что в итоге даёт нам целую часть деления x на y.

Если вам нужно получить результат деления x на y с округлением вниз, то такой подход вполне уместен. Однако вы также можете воспользоваться более прямым методом, например, используя функцию Math.floor(x / y), которая сделает то же самое, но в более лаконичной форме.

0

Вы можете использовать функцию parseInt, чтобы получить целочисленный результат (отсечённое значение).

parseInt(a / b)

Чтобы получить остаток, используйте оператор остатка:

a % b

У parseInt есть некоторые тонкости с обработкой строк, поэтому для избегания ошибок рекомендуется использовать параметр радикса с основанием 10:

parseInt("09", 10)

В некоторых случаях строковое представление числа может быть в научной нотации, и в этом случае parseInt вернёт неправильный результат.

parseInt(100000000000000000000000000000000, 10) // 1e+32

Этот вызов вернёт 1 в результате.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь