Python和Java中模运算的差异
我注意到Python和Java对取模运算符的实现方式不一样。
比如,在Python中:
>>> print -300 % 800
>>> 500
而在Java中:
System.out.println(-300 % 800);
-300
这让我有点意外,因为我以为像取模这样基础的东西在不同语言中应该是一样的。我比较喜欢Python的做法(我猜是借鉴自C语言),虽然我也理解Java的逻辑。
你们通常更喜欢哪种?为什么会有这样的不同呢?我并不是想引发语言争论,只是好奇而已。
4 个回答
1
在C语言的标准中,负数取模是没有明确规定的,所以很多C语言编译器的结果和Java的结果是一样的。不过在Python中,取模的结果总是一个正数,这通常更有用,因为这样你可以进行取模的加法和减法。如果负数取模的结果是负数,那就会出现问题,无法正常工作。
我真的不知道从取模中得到负数有什么好处。
4
现在试试这个:
>>> print 300 % -800
-500
之所以会有这种差异,是因为编程语言的设计者们对于除法运算后余数的符号到底应该跟随被除数(dividend)还是除数(divisor)一直没有达成一致。有些语言甚至根本不规定这个,所以具体的实现就看开发者怎么做了。
在维基百科的模运算页面上有一个语言列表,里面列出了运算符和你可以期待的符号。这是一个很好的起点,但我通常会先做几个简单的测试,以确保我知道在任何我之前没有测试过的语言中,%
会如何表现。
6
我更喜欢C语言的解释(Python也是这样),在这里%
确实是一个取模运算符。关于这个话题,维基百科的页面上有很好的讨论,还有一些相关的链接(其中提到的一个小细节是,如果不小心的话,取被除数的符号可能会导致一个很傻的错误;-)。