为什么%运算符在Python和Java中的工作方式不同?

时间:2011-11-23 04:47:56

标签: java python

Python 2.7.1:

print -34 % 4 # outputs 2

Java 1.5.0:

System.out.println(-34 % 4); // outputs -2

哪个是对的?为什么不同?

wikipedia article on modulo

  

当a或n为负数时,这个天真的定义会失效,编程语言在定义这些值方面会有所不同。

也许这不是一个正确的SO问题,会被删除,但我有兴趣看到回复。

4 个答案:

答案 0 :(得分:6)

这只是语言选择的惯例。没有一个选择在数学上比另一个更正确。

可以在源代码中找到有关Python选择原因的提示:http://hg.python.org/cpython/file/2.7/Objects/intobject.c#l567

Python的版本是数论中更常用的版本。 Java版本实现与C相同的行为.Python方式很方便,因为结果的符号始终与除数相同。这意味着当 n 为正时,x % n总是在0 <= result < n中给出一个值。

我推测像C这样的低级语言使用不同约定的原因是它“更接近金属”,返回与机器语言中的n signed division相同的结果(例如,参见IDIV)。如果C采用数论公约,则需要编译附加指令以将结果的符号与除数的符号进行比较,如果它们不匹配,则跳转到附加代码以添加或减去除数的除数。结果(IOW,C采用与最小努力相对应的约定)。

答案 1 :(得分:0)

这是因为两种语言的编程方式。

Java在应用模数(%)运算符时考虑了分子的符号,而Python则没有。

如果用分母写“ - ”符号,即使Java也会忽略它。

答案 2 :(得分:0)

  

为什么%运算符在Python和Java中的工作方式不同?

简单:因为Python不是Java,它们的不同之处在于您从维基百科文章中引用的方法。 :)

但是,说真的,这是一个相当随意的选择;一个定义在某些情况下更有用,而(?)other在其他情况下更有用。很高兴你用一种选择一种语言的语言工作,而不是只使用那种CPU上最快的语言;)

答案 3 :(得分:-1)

在c / c ++中,结果是-2。所以我猜这就是Java走向另一个方向的原因。他们对开始时吸引C ++开发人员非常感兴趣。