Как выполнить целочисленное деление и отдельно получить остаток в JavaScript?
Заголовок: Как в JavaScript получить целую часть от деления и остаток от деления?
Описание проблемы:
В JavaScript мне нужно решить задачу, связанную с делением двух целых чисел. Конкретно, я хочу получить:
- Целую часть от деления одного целого числа на другое.
- Остаток от этого деления.
Как правильно сделать это в JavaScript? Буду благодарен за пример кода и объяснение используемых методов.
5 ответ(ов)
Для вычисления частного и остатка от деления некоторого числа 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.
Я провел тесты скорости в 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
.
Вы можете использовать следующий код для вычисления частного и остатка от деления:
const quotient = (a - a % b) / b;
const remainder = a % b;
Хотя это и не самый элегантный способ, он вполне работоспособен. Если вам важно получить более чистое решение, то можно воспользоваться встроенной функцией Math.floor
для получения частного:
const quotient = Math.floor(a / b);
const remainder = a % b;
Этот метод также корректно работает и может сделать код немного более понятным.
Ваш код выполняет операцию деления x
на y
с округлением вниз. Давайте разберём его строка за строкой:
var remainder = x % y;
- здесь мы вычисляем остаток от деленияx
наy
. Это значение будет представлять собой то, что остаётся после деления.return (x - remainder) / y;
- в этой строке мы сначала вычитаем остаток изx
, тем самым получая наибольшее число, которое делится наy
без остатка. Затем мы делим эту разницу наy
, что в итоге даёт нам целую часть деленияx
наy
.
Если вам нужно получить результат деления x
на y
с округлением вниз, то такой подход вполне уместен. Однако вы также можете воспользоваться более прямым методом, например, используя функцию Math.floor(x / y)
, которая сделает то же самое, но в более лаконичной форме.
Вы можете использовать функцию parseInt
, чтобы получить целочисленный результат (отсечённое значение).
parseInt(a / b)
Чтобы получить остаток, используйте оператор остатка:
a % b
У parseInt
есть некоторые тонкости с обработкой строк, поэтому для избегания ошибок рекомендуется использовать параметр радикса с основанием 10:
parseInt("09", 10)
В некоторых случаях строковое представление числа может быть в научной нотации, и в этом случае parseInt
вернёт неправильный результат.
parseInt(100000000000000000000000000000000, 10) // 1e+32
Этот вызов вернёт 1 в результате.
Какое наибольшее целочисленное значение в JavaScript, при котором не теряется точность?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"