2010-12-10 4 views
9

Получено из этого вопроса: (Java) How does java do modulus calculations with negative numbers?Что такое -13% 64 = -13 в PHP?

В любом месте, чтобы заставить PHP возвращать положительные 51?

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

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

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

+1

обновлено ... ищет решение без использования метода угадывания – ajreal 2010-12-10 13:38:58

+2

Невозможно изменить параметры настройки, как математика работает на PHP. Если бы это было тогда, это, вероятно, сломало бы PHP, который я бы себе представлял, используя множество вычислений внутри. – Gareth 2010-12-10 13:40:38

+0

Это не предполагаемый алгоритм. Удивительно, что Python и Perl принимают его, но PHP этого не делает. Используйте обходной путь. Btw, `fmod()` и `bcmod()` и `gmp_mod()` тоже не делают. – mario 2010-12-10 13:46:06

ответ

5

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

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

Пример:

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

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

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

будет как возвращение -51 вместо (which is a bug).

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

12

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

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

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

0

PHP manual говорит, что

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

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

3

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

Почему я говорю неисправность? Потому что согласно математическому определению, a remainder must be zero or positive.

Простое решение для обработки случае себя:

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

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

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

Смежные вопросы