2012-03-24 3 views
0

Я использую PHP для проекта, и я ожидаю, что -1 % 4 вернется 3. Тем не менее, конечный результат в PHP -1, и я не знаю, почему:Каков правильный ответ -1% 4?

php > echo -1 % 4; 
-1 

Я проверил в Ruby, IRB и результат 3:

irb(main):001:0> puts -1 % 4 
3 
+1

% означает '-1 мод (4)' и его равным -1 в математике – safarov

+2

@ Сафаров: Собственно, '%' обычно определяется как оператор ** остатка **, который имеет менее четко определенное математическое определение. –

+4

@ сафаров «в математике» - это широкое заявление. Если вы имеете дело с Z_4, -1 и 3 являются одним и тем же объектом. – Dougal

ответ

5

Поскольку это определено в терминах разделения, так что:

a%b == a - (a/b)*b 

Для отделов с отрицательными результатами возможны два возможных определения; либо вы округлите к нулю, либо округлите к отрицательной бесконечности. Различные языки программирования сделали этот выбор по-разному.

Для получения дополнительной информации см. http://en.wikipedia.org/wiki/Modulo_operator#Remainder_calculation_for_the_modulo_operation.

+0

Я уверенно читаю это неправильно, но разве это вычисление не даст 'a - a', создав тем самым 0? –

+0

@RobinCastlin: Нет, потому что это выполняется в целочисленной арифметике. –

1

В этих двух конкретных языках при обработке целых делений, содержащих отрицательные операнды, PHP округляет результат до нуля, а Ruby округляется до -infinity.


В PHP от Arithmetic Operators:

Результат оператора модуля % имеет тот же знак, что и дивиденды.

В Ruby от Numeric#divmod:

Частное округляется в сторону -бесконечности

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