2010-02-07 2 views
14

Я заметил различные реализации модуля модуля в Python и Java.Разница между реализацией модуля в Python Vs Java

Например, в Python:

>>> print -300 % 800 
>>> 500 

В то время как в Java:

System.out.println(-300 % 800); 
-300 

Это застало меня врасплох, так как я думал, что что-то в качестве основных, как модуль был универсально интерпретированы таким же образом. Я поклонник интерпретации Python (который, как я полагаю, заимствован из C), хотя я вижу логику реализации Java.

Что вы обычно предпочитаете? Есть ли какая-то конкретная причина для разных интерпретаций? Я не собираюсь начинать языческую войну, просто любопытно.

+1

Если я читаю страницу Википедии, что Алекс отвечал правильно, math.fmod Пайтона будет возвращать один и тот же результат, как и мода Java. –

ответ

6

Я предпочитаю интерпретацию языка C (также используется в Python), где % действительно является оператором модуля. Хорошее обсуждение в wikipedia page и ссылки из него (в том числе один бит о том, почему принятие вместо этого признака дивиденда может привести к одной глупой ошибке, если вы не будете осторожны ;-).

+0

C99 использует знак дивиденда, C89 зависит от реализации, по крайней мере, согласно статье, которую вы связали. – ergosys

+0

Вы можете использовать '%' в Java, чтобы написать функцию, которая делает то же самое, что и Python; см. http://stackoverflow.com/a/3417242/320036 – z0r

+0

C ведет себя как Java, а не Python. – ryancerium

1

В стандарте C, отрицательный по модулю не определен, и многие компиляторы даст вам то, что Java дает вам. В python, однако, вы всегда получите положительное число, которое часто более полезно, потому что это означает, что вы можете выполнять добавление и вычитание по модулю. Если отрицательный modulo должен был дать вам отрицательный результат, это не сработало бы должным образом.

Я понятия не имею, какие преимущества при получении отрицательного числа от по модулю имеет.

0

Я предпочитаю x mod n указать числа от 0 до n-1 или между полом (n/2) -n и этажом (n/2); это облегчает выполнение математики в голове.

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

Кстати, Java не вполне может сделать свой ум -% от отрицательных чисел возвращает отрицательное значение, mod метод java.math.BigInteger возвращает значения между 0 и п-1 (включительно), и метод divideAndRemainder снова возвращает отрицательное значения для отрицательных целых чисел.

3

Теперь попробуйте это:

>>> print 300 % -800 
-500 

Причина разницу в том, что разработчики языка не могут решить, будет ли остаток после деления должен иметь знак дивидендов или делителя. Некоторые языки даже не указывают того или другого, так что это зависит от исполнителя.

Там в список языков, оператор, и какой знак ожидать на Википедии странице Modulo operation. Это хорошее место для начала, но я обычно просто запускаю несколько простых тестов, чтобы убедиться, что я точно знаю, как будет вести себя %, прежде чем использовать его на любом языке, который я раньше не тестировал.

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