Python与Java中的模数实现之间的差异

时间:2010-02-07 00:16:42

标签: java python modulo

我注意到Python和Java中模数运算符的不同实现。

例如,在Python中:

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

而在Java中:

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

这让我措手不及,因为我认为像模数一样基本的东西被普遍解释为同样的方式。我喜欢Python的解释(我认为它是从C借用的),尽管我看到了Java实现背后的逻辑。

您通常更喜欢哪一个?有不同解释的具体原因吗?我无意开始语言战,只是好奇。

4 个答案:

答案 0 :(得分:6)

我更喜欢C的解释(也用于Python),其中%确实是模数运算符。 wikipedia page中的良好讨论及其中的链接(包括一些关于为什么采用红利的标志可能导致一个愚蠢的错误,除非一个人小心; - )。

答案 1 :(得分:3)

现在试试这个:

>>> print 300 % -800
-500

差异的原因是语言设计者似乎无法确定除法后的余数是否应该具有被除数除数的符号。有些语言甚至没有指定其中一种语言,因此由实施者来决定。

Modulo operation维基百科页面上有一个语言列表,运算符和符号。这是一个很好的起点,但我通常只是运行一些简单的测试,以确保我确切地知道%在我以前没有测试过的任何语言之前的行为方式。

答案 2 :(得分:1)

在C标准中,负模数是未定义的,许多C编译器将为您提供Java所提供的功能。但是在python中,你总是得到一个正数,这通常更有用,因为它意味着你可以做模数加法和减法。如果负模数给你一个负数,它将无法正常工作。

我不知道从模数中得到负数有什么好处。

答案 3 :(得分:0)

我更喜欢x mod n给出介于0和n-1之间或介于(n / 2)-n和floor(n / 2)之间的数字;这使得最容易进行数学计算。

只要一切都是等价的,我对语言并不在意 - 尽管人们必须要注意这个惯例。

顺便说一句,Java无法完全理解 - 负整数上的%返回负值,mod java.math.BigInteger方法返回0到n-1(含)之间的值,并且divideAndRemainder方法再次返回负整数的负值。