print -34 % 4 # outputs 2
System.out.println(-34 % 4); // outputs -2
哪个是对的?为什么不同?
当a或n为负数时,这个天真的定义会失效,编程语言在定义这些值方面会有所不同。
也许这不是一个正确的SO问题,会被删除,但我有兴趣看到回复。
答案 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 ++开发人员非常感兴趣。