Python和Java中模数实现的区别

Python和Java中模数实现的区别,java,python,modulo,Java,Python,Modulo,我注意到Python和Java中模运算符的不同实现 例如,在Python中: >>> print -300 % 800 >>> 500 鉴于在Java中: System.out.println(-300 % 800); -300 这让我措手不及,因为我认为像模数这样基本的东西通常都是以同样的方式解释的。我非常喜欢Python的解释(我认为它是从C中借用的),尽管我看到了Java实现背后的逻辑 你通常更喜欢哪一种?对于不同的解释有什么具体的原因吗?我不想发动

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

例如,在Python中:

>>> print -300 % 800
>>> 500
鉴于在Java中:

System.out.println(-300 % 800);
-300
这让我措手不及,因为我认为像模数这样基本的东西通常都是以同样的方式解释的。我非常喜欢Python的解释(我认为它是从C中借用的),尽管我看到了Java实现背后的逻辑


你通常更喜欢哪一种?对于不同的解释有什么具体的原因吗?我不想发动语言战争,只是好奇而已。

我更喜欢C的解释(也在Python中使用),其中
%
确实是一个模运算符。在中进行了很好的讨论,并提供了相关链接(包括一点关于为什么如果不小心,使用红利符号会导致一个愚蠢的错误;-)。

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


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

我更喜欢
x mod n
给出0到n-1之间或楼层(n/2)-n和楼层(n/2)之间的数字;这使得在头脑中进行数学运算变得容易

只要所有的东西都是等价的,我就不在乎什么时候涉及到语言——尽管人们必须意识到这个惯例

顺便说一句,Java无法下定决心--%on负整数返回负值,
Java.math.BigInteger
mod
方法返回0到n-1(包括)之间的值,
divideandMainder
方法再次返回负整数的负值。

现在尝试以下方法:

>>> print 300 % -800
-500
造成这种差异的原因是,语言设计者似乎无法决定除法后的余数是否应该具有除数或除数的符号。有些语言甚至没有指定其中一种,所以这取决于实现者


Wikipedia页面上有一个语言列表、运算符和期望的符号。这是一个很好的开始,但我通常只是运行一些简单的测试,以确保在我使用之前没有测试过的任何语言之前,我确切地知道
%
将如何运行。

如果我正在阅读Alex发布的Wikipedia页面,Python的math.fmod将返回与Java的mod.C99使用红利符号相同的结果,至少根据您链接的文章,C89依赖于实现;请参见C的行为类似于Java,而不是Python。