17

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

例如,在 Python 中:

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

而在 Java 中:

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

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

你通常更喜欢哪个?不同的解释有什么具体原因吗?我无意发动语言战争,只是好奇。

4

4 回答 4

6

我更喜欢 C 的解释(也用于 Python),其中%确实是一个模运算符。在维基百科页面和其中的链接中进行了很好的讨论(包括一点关于为什么用红利符号代替会导致一个愚蠢的错误,除非一个人小心;-)。

于 2010-02-07T00:20:43.100 回答
4

现在试试这个:

>>> print 300 % -800
-500

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

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

于 2010-02-07T02:41:22.610 回答
1

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

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

于 2010-02-07T00:25:50.470 回答
0

我更喜欢x mod n给出 0 和 n-1 之间或 floor(n/2)-n 和 floor(n/2) 之间的数字;这使得在头脑中做数学变得最容易。

只要一切都是等价的,就语言而言,我并不在乎——尽管必须了解约定。

顺便说一句,Java 还不能完全下定决心——负整数的 % 返回负值,返回 0 和 n-1(包括)之间的值的方法,该mod方法再次返回负整数的负值。java.math.BigIntegerdivideAndRemainder

于 2010-02-07T02:09:59.817 回答