В JavaScript , как я могу получить:
- Сколько раз одно целое число входит в другое?
- Остаток?
В JavaScript , как я могу получить:
Для некоторого числа y
и некоторого делителя x
вычислить частное ( quotient
) и остаток ( remainder
) как:
var quotient = Math.floor(y/x);
var remainder = y % x;
3.5 % 2
оценивается в 1,5. Обязательно обрабатывайте (parseInt, floor и т. Д.) Как требуетсяfloor
и%
вместе не согласовано таким образом. Либо используйтеtrunc
вместоfloor
(тем самым разрешая отрицательные остатки), либо используйте вычитание, чтобы получить остаток (rem = y - div * x
).rem
любом случае, вы можете получить частноеdiv
быстрее без пола:(y - rem) / x
. 2. Кстати, операция по модулю в соответствии с рекомендуемым определением Дональда Кнута (знак-совпадение-делитель, а не остаток, то есть евклидов модуль, или знак-совпадение-дивиденд JavaScript) - это то, что мы можем кодировать в JavaScript какfunction mod (a, n) { return a % n + (Math.sign(a) !== Math.sign(n) ? n : 0); }
.Я не эксперт в побитовых операторах, но вот еще один способ получить целое число:
Это будет работать правильно и для отрицательных чисел, а также
Math.floor()
будет округлено в неправильном направлении.Это также кажется правильным:
источник
a/b | 0
~~int
,int | 0
иint >> 0
не изменяет начальный аргумент, но заставляет интерпретатор передавать неотъемлемую часть оператору.floor
вряд ли поворачивает в неправильном направлении, учитывая его имя - просто не то направление, которое люди обычно хотят, хотя!a = 12447132275286670000; b = 128
Math.floor(a/b)
->97243220900677100
и~~(a/b)
->-1231452688
.~~(5/2) --> 2
как делает(5/2)>>0 --> 2
, но~~(5/2) + 1 --> 3
пока~~(5/2)>>0 + 1 --> 1
.~~
это хороший выбор, потому что приоритет более уместен.Я сделал несколько тестов скорости на Firefox.
Вышеуказанное основано на 10 миллионах испытаний для каждого.
Вывод: используйте
(a/b>>0)
(или(~~(a/b))
или(a/b|0)
), чтобы добиться повышения эффективности примерно на 20%. Также имейте в виду, что все они несовместимы сMath.floor
, когдаa/b<0 && a%b!=0
.источник
Math.floor
других функциях API «кто знает, сколько» или узнать об~
операторе (побитовом нет) и о том, как побитовые операции работают в JS, а затем понять эффект двойной тильды?Math.floor
лучше. И даже если нет, то этот является Googleable.ES6 представляет новый
Math.trunc
метод. Это позволяет исправить ответ @ MarkElliot, чтобы он работал и для отрицательных чисел:Обратите внимание, что
Math
методы имеют преимущество перед побитовыми операторами в том, что они работают с числами свыше 2 31 .источник
18014398509481984 == 18014398509481985
.~~(x/y)
. Нужно поддерживать большие числа до 54 битов со знаком? Используйте,Math.trunc
если у вас есть, илиMath.floor
иным образом (исправить для отрицательных чисел). Нужно поддерживать еще большие цифры? Используйте некоторую библиотеку больших чисел.divmod
, вы можете реализовать это так:function divmod(x, y) { var div = Math.trunc(x/y); var rem = x % y; return [div, rem]; }
источник
Math.trunc
:). Я проверил с 100,3; -100,3; 100, -3 и -100, -3. Конечно, прошло много времени с тех пор, как ваш комментарий изменился.Я обычно использую:
Это, вероятно, не самый элегантный, но это работает.
источник
Вы можете использовать функцию,
parseInt
чтобы получить усеченный результат.Чтобы получить остаток, используйте оператор мод:
У parseInt есть некоторые подводные камни со строками, чтобы избежать использования параметра radix с основанием 10
В некоторых случаях строковое представление числа может быть научной нотацией, в этом случае parseInt даст неправильный результат.
Этот вызов даст 1 как результат.
источник
parseInt
следует избегать, когда это возможно. Вот предупреждение Дугласа Крокфорда: «Если первый символ строки равен 0, то строка оценивается в базе 8 вместо базы 10. В базе 8, 8 и 9 не являются цифрами, поэтому parseInt (" 08 ") и parseInt ("09") в качестве результата выдаются 0. Эта ошибка вызывает проблемы в программах, которые анализируют даты и время. К счастью, parseInt может принимать параметр radix, так что parseInt ("08", 10) выдает 8. Я рекомендую вам всегда предоставить параметр radix. " archive.oreilly.com/pub/a/javascript/excerpts/...parseInt
следует избегать; Просто есть некоторые ошибки, о которых нужно знать. Вы должны знать об этих вещах и быть готовыми справиться.parseInt
с аргументом числа.parseInt
должен анализировать частично-числовые строки, а не усекать числа.JavaScript вычисляет прямо пол отрицательных чисел и остаток нецелых чисел, следуя математическим определениям для них.
FLOOR определяется как «наибольшее целое число, меньшее, чем параметр», таким образом:
REMAINDER определяется как «остаток» от деления (евклидова арифметика). Когда дивиденд не является целым числом, частное, как правило, также не является целым числом, то есть нет остатка, но если частное вынуждено быть целым числом (и это то, что происходит, когда кто-то пытается получить остаток или модуль число с плавающей запятой), очевидно, будет нецелое «оставшееся».
JavaScript действительно рассчитывает все, как и ожидалось, поэтому программист должен быть осторожным, чтобы задавать правильные вопросы (и люди должны быть осторожны, чтобы ответить на то, что спрашивают!) Первый вопрос Ярина был НЕ «что такое целочисленное деление X на Y», но, вместо этого, «ВЕСЬ количество раз, когда данное целое число ПРОХОДИТ В другое». Для положительных чисел ответ одинаков для обоих, но не для отрицательных, потому что целочисленное деление (делитель на делитель) будет на -1 меньше, чем число, которое (делитель) «переходит» в другое (делимое). Другими словами, FLOOR вернет правильный ответ для целочисленного деления отрицательного числа, но Ярин этого не спрашивал!
gammax правильно ответил, что код работает так, как спросил Ярин. С другой стороны, Самуил не прав, он, наверное, не делал математику, иначе он бы увидел, что это работает (также он не сказал, что было делителем его примера, но я надеюсь, что это было 3):
Остаток = X% Y = -100% 3 = -1
GoesInto = (X - остаток) / Y = (-100 - -1) / 3 = -99 / 3 = -33
Кстати, я протестировал код на Firefox 27.0.1, он работал как положено, с положительными и отрицательными числами, а также с нецелыми значениями, как для делимого, так и для делителя. Пример:
-100,34 / 3,57: GoesInto = -28, остаток = -0,3800000000000079
Да, я заметил, что здесь есть проблема точности, но у меня не было времени проверить ее (я не знаю, проблема ли это с Firefox, Windows 7 или с FPU моего процессора). Для вопроса Ярина, который включает только целые числа, код gammax работает отлично.
источник
Math.floor(operation)
возвращает округленное значение операции.Пример 1- го вопроса:
Приставка:
Пример 2 - й вопрос:
Приставка:
источник
Вычисление количества страниц может быть сделано за один шаг: Math.ceil (x / y)
источник
Комментарий Алекса Мура-Ниеми как ответ:
Для Rubyists здесь от Google в поисках
divmod
, вы можете реализовать это так:Результат:
источник
divmod
использует floored Division (Math.floor
), который отличается от усеченного Division (Math.trunc
), когда задействованы отрицательные числа. Это относится и к пакету NPMdivmod
, Rubydivmod
, SWI-Prologdivmod
и, возможно, ко многим другим реализациям.divmod
существует, потому что он выполняет в два раза быстрее, чем вычисление двух операций по отдельности. Предоставление такой функции без этого выигрыша в производительности может сбить с толку.Если вы просто делитесь со степенью двойки, вы можете использовать побитовые операторы:
(Первое является частным, второе - оставшимся)
источник
function divideByPowerOf2(num, exponent) { return [num >> exponent, num & ((1 << exponent) - 1)]; }
.Вы можете использовать троичный, чтобы решить, как обрабатывать положительные и отрицательные целочисленные значения.
Если число положительное, все в порядке. Если число отрицательное, оно добавит 1 из-за того, как Math.floor обрабатывает отрицания.
источник
Это всегда будет обрезаться до нуля. Не уверен, что уже слишком поздно, но вот оно:
источник
Если вам нужно вычислить остаток для очень больших целых чисел, которые среда выполнения JS не может представить как таковая (любое целое число больше 2 ^ 32 представляется как число с плавающей точкой, и поэтому оно теряет точность), вам нужно сделать некоторый трюк.
Это особенно важно для проверки большого количества контрольных цифр, которые присутствуют во многих случаях нашей повседневной жизни (номера банковских счетов, кредитные карты, ...)
Прежде всего, вам нужен ваш номер в виде строки (иначе вы уже потеряли точность, а остальное не имеет смысла).
Теперь вам нужно разбить вашу строку на более мелкие части, достаточно маленькие, чтобы объединение любого остатка и фрагмента строки могло уместиться в 9 цифр.
Подготовьте регулярное выражение для разбиения строки
Например, если
digits
7, регулярное выражениеОн соответствует непустой подстроке максимальной длины 7, за которой следует (
(?=...)
является положительным взглядом) количество символов, кратное 7. «g» - заставить выражение проходить по всей строке, не останавливаясь при первом совпадении.Теперь преобразуйте каждую часть в целое число и вычислите остатки
reduce
(добавив обратно предыдущий остаток - или 0 - умноженный на правильную степень 10):Это будет работать из-за алгоритма остатка «вычитания»:
который позволяет заменить любую «начальную часть» десятичного представления числа его остатком, не затрагивая последний остаток.
Окончательный код будет выглядеть так:
источник