Как разделить числа без остатка в PHP? - PullRequest
43 голосов
/ 27 апреля 2011

Как можно разделить числа, но исключить остаток в PHP?

Ответы [ 6 ]

83 голосов
/ 27 апреля 2011

Просто приведите полученное значение к целому.

$n = (int) ($i / $m);

Интересные функции (в зависимости от того, чего вы хотите достичь и ожидаете ли вы деления отрицательных целых чисел): floor(), ceil() и round() .

8 голосов
/ 28 января 2018

PHP 7 имеет новую встроенную функцию для этого имени intdiv.

Пример:

$result = intdiv(13, 2);

Значение $result в этом примере будет 6.

Полную документацию по этой функции можно найти в документации PHP .

.
6 голосов
/ 11 августа 2016

Для большинства практических целей принятый ответ является правильным.

Однако для сборок, в которых целые числа имеют ширину 64 бита, не все возможные целочисленные значения представляются в виде числа с плавающей запятой двойной точности;См. Мой комментарий к принятому ответу для получения подробной информации.

Вариант

$n = ($i - $i % $m) / $m;

(код взят из комментария KingCrunch под другим ответом) позволит избежать этой проблемы в зависимости от желаемого поведения округления (медвежийИмейте ввиду, что результат оператора модуля может быть отрицательным).

0 голосов
/ 25 апреля 2017

В дополнение к вышеприведенным решениям, таким как $result = intval($a / $b), существует один конкретный случай:

Если вам нужно целочисленное деление (без остатка) на некоторую степень двойки ($b равно 2 ^ N), вы можете использовать операцию побитового сдвига вправо:

$result = $a >> $N;

где $ N - это число от 1 до 32 в 32-разрядной операционной системе или 64 для 64-разрядных.

Иногда это полезно, потому что самое быстрое решение для случая $ b - это некоторая степень двойки.

И есть обратный (будьте осторожны из-за переполнения!) Операция умножения на степень двух:

$result = $a << $N;

Надеюсь, это кому-то тоже поможет.

0 голосов
/ 20 ноября 2015

или вы можете просто сделать intval (13/2) дает 6

0 голосов
/ 13 июля 2013

использовать по модулю в php:

$n = $i % $m;
...