Вывод из этого вопроса: (Java) Как java выполняет вычисления модуля с отрицательными числами?
Anywhere, чтобы заставить PHP возвращать положительные 51?
Обновить
Ищете настройку конфигурации для исправления, вместо этого трудно угадать
Или другая математическая функция, такая как bcmath?
обновленный
Не полностью убежден в этом java-ответе, так как он не учитывает отрицательный модуль -13+(-64) =?
Если 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 во всех трех случаях. Это не будет сделано на моей машине разработки.
В любом случае, сообщение, на которое вы ссылались, уже дало правильный ответ:
$r = $x % $n; if ($r < 0) { $r += abs($n); }
Где $ x = -13 и $ n = 64.
Операция modulo должна найти остаток от деления числа на другой. Но, строго говоря, на большинстве основных языков программирования функция modulo работает, если дивиденды или / и делители отрицательны . Сюда входят PHP, Perl, Python, Java, C, C ++ и т. Д.
Почему я говорю о неисправности? Поскольку согласно математическому определению остаток должен быть равен нулю или положителен .
Простое решение состоит в том, чтобы самостоятельно обрабатывать дело:
if r < 0 then r = r + |divisor|;
| Делитель | является абсолютным значением делителя.
Другое решение – использовать библиотеку (как указал @Gordon). Однако я бы не использовал библиотеку для обработки простого случая, подобного этому.
В руководстве по PHP говорится, что
Результат оператора модуля% имеет тот же знак, что и дивиденд, т. Е. Результат $ a% $ b будет иметь тот же знак, что и $ a. Например
поэтому это не настраивается. Используйте варианты, предложенные в вопросе, который вы связали с