Как -13% 64 = -13 в PHP? - PullRequest
       17

Как -13% 64 = -13 в PHP?

11 голосов
/ 10 декабря 2010

Получено из этого вопроса: (Java) Как Java выполняет вычисления модуля с отрицательными числами?

Где-нибудь, чтобы заставить PHP вернуть положительный результат 51?

обновление
Ищете параметр конфигурации, чтобы исправить, вместо этого трудно угадать

Или другие математические функции, такие как bcmath?

обновлен
Не полностью убежден этим ответом Java, так как он не учитывает отрицательный модуль -13+(-64) =?

Ответы [ 4 ]

12 голосов
/ 10 декабря 2010

В любом случае, ссылка, на которую вы ссылались, уже дала правильный ответ:

$r = $x % $n;
if ($r < 0)
{
    $r += abs($n);
}

Где $ x = -13 и $ n = 64.

6 голосов
/ 10 декабря 2010

Если доступно GMP , вы можете использовать gmp_mod

Рассчитывает n по модулю d. Результат всегда неотрицателен, знак d игнорируется.

Пример:

echo gmp_strval(gmp_mod('-13', '64')); // 51

Обратите внимание, что n и d должны быть номерными ресурсами GMP или числовыми строками. Все остальное не сработает¹

echo gmp_strval(gmp_mod(-13, 64));
echo gmp_mod(-13, 64);

вместо этого вернет -51 (, что является ошибкой ).

¹ при выполнении вышеупомянутого в этой кодовой панели , будет выдавать 51 во всех трех случаях. Это не будет делать на моей машине разработки.

4 голосов
/ 14 января 2011

Операция по модулю должна найти остаток от деления числа на другое. Но, строго говоря, в большинстве основных языков программирования неисправность операции по модулю, если дивиденд или / и делитель отрицательны . Это включает PHP, Perl, Python, Java, C, C ++ и т. Д.

Почему я говорю неисправность? Поскольку согласно математическому определению, остаток должен быть нулевым или положительным .

Простое решение - разобраться с делом самостоятельно:

if r < 0  then r = r + |divisor|;

| делитель | является абсолютным значением делителя.

Другое решение - использовать библиотеку (как указывал @Gordon). Однако я бы не стал использовать библиотеку для обработки простого случая, подобного этому.

0 голосов
/ 10 декабря 2010

В руководстве по PHP сказано, что

Результат оператора модуля% имеет тот же знак, что и дивиденд, то есть результат $ a% $ b будетиметь тот же знак, что и $ a.Например,

, так что это не настраивается.Используйте варианты, предложенные в вопросе, который вы связали с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...