Я использую PHP для проекта и ожидаю, что -1 % 4 вернет 3.Тем не менее, окончательный результат - -1 в PHP, и я не знаю почему:
-1 % 4
3
-1
php > echo -1 % 4; -1
Я проверил в Ruby IRB, и результат 3:
irb(main):001:0> puts -1 % 4 3
Потому что оно определено в терминах деления, такое что:
a%b == a - (a/b)*b
Для делений с отрицательными результатами есть два возможных определения; либо вы округляетесь до нуля, либо вы округляетесь до отрицательной бесконечности. Различные языки программирования сделали этот выбор по-разному.
См. http://en.wikipedia.org/wiki/Modulo_operator#Remainder_calculation_for_the_modulo_operation для получения дополнительной информации.
В этих двух конкретных языках при обработке целочисленных делений с отрицательными операндами PHP округляет результат до нуля, а Ruby округляет до -infinity.
В PHP от Арифметические операторы :
Результат оператора модуля % имеет тот же знак, что и дивиденд.
%
В Ruby от Numeric#divmod:
Numeric#divmod
Коэффициент округляется до -infinity