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

标签 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

When either a or n is negative, this naive definition breaks down and programming languages differ in how these values are defined.

也许这不是一个合适的 SO 问题,会被删除,但我很想看看回复。

最佳答案

这只是语言选择的约定。没有一种选择在数学上比另一种更正确。

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

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

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

关于java - 为什么 % 运算符在 Python 和 Java 中的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8237469/

相关文章:

python - 使用 Keras ImageDataGenerator 预测进行索引会引发不可散列类型错误

java - 将不同的对象存储在从同一抽象类扩展的容器中

java - 在 Java 中使用 XQueryCompiler 仅提取值

java - ReadLine 不等待输入

Java 在一个类中与 mysql 建立连接,但不在不同的类中建立连接

python - 如何提取日期条件下的行

java - ApplicationContextAware 在 Spring 中是如何工作的?

python - 是否有用于 python 的交互式图形库

python - 如何找到用户输入的数字之间的数字?

python - Django 模型可以实例化的最大对象数量?