операнд модуля в рубине по сравнению с PHP - PullRequest
9 голосов
/ 13 сентября 2011

Я ищу простое объяснение того, как работает операнд по модулю Ruby и почему, в Ruby

puts  4 % 3   # 1
puts -4 % 3   # 2 <--why?
puts -4 % -3  # -1 

но в PHP:

<?php

echo  4 % 3;  #  1
echo -4 % 3;  # -1
echo -4 % -3; # -1

По-моему, -4% 3 на самом деле 8% 3 (8 - разница между 4 и -4).

Ответы [ 4 ]

15 голосов
/ 13 сентября 2011

Они оба могут считаться правильными, в зависимости от вашего определения. Если a % n == r, то оно должно содержать:

a == q*n + r

, где q == a / n.

Положительный или отрицательный r определяется значением q. Итак, в вашем примере, либо из:

-4 == -1*3 + (-1)   // PHP
-4 == -2*3 + 2      // Ruby

Другими словами, определение % зависит от определения /.

См. Также таблицу здесь: http://en.wikipedia.org/wiki/Modulus_operator#Remainder_calculation_for_the_modulo_operation. Вы увидите, что это существенно различается для разных языков программирования.

6 голосов
/ 13 сентября 2011

Вот фрагмент по теме от Язык программирования Ruby , автор Матц и Дэвид Фланаган.

Когда один (но не оба) изоперанды отрицательные, Ruby выполняет операции целочисленного деления и по модулю не так, как языки C, C ++ и Java (но так же, как языки Python и Tcl).Рассмотрим частное -7/3.Рубин округляет отрицательную бесконечность и возвращает -3.C и родственные языки округляют до нуля и возвращают -2.В Ruby -a / b равен a / -b, но не равен - (a / b).

Определение работы модуля в Ruby также отличается от определения в C и Java.В Ruby -7% 3 равно 2. В C и Java результат равен -1.Величина результата отличается, потому что отношение отличалось.Но знак результата тоже отличается.В Ruby знак результата всегда является знаком второго операнда.В C и Java знак результата всегда является знаком первого операнда.(Метод остатка Руби ведет себя как оператор C по модулю.)

1 голос
/ 12 июля 2013

Это на самом деле сводится к реализации целочисленного приведения / округления языка.Так как фактическое уравнение:

a - (n * int(a/n))

Это часть int(a/n) уравнения, которая отличается.Если a == -4 и n == 3, PHP вернет -1, а Ruby выдаст -2.Теперь уравнение выглядит следующим образом в Ruby:

-4 - (3 * -2)

и это в PHP

-4 - (3 * -1)
0 голосов
/ 13 сентября 2011

Согласно Wolfram Alpha , 2 является правильным.

edit: Кажется, вы должны спросить, почему PHP работает таким образом?

edit2: PHP определяет его какостаток от деления А / Б.Полагаю, вы считаете, что это ошибка, неправильный или иной способ действий.Лично я еду за первым 2.

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