为啥 -1 / 2 == -1 在 Ruby 和 Python 中? [复制]

Posted

技术标签:

【中文标题】为啥 -1 / 2 == -1 在 Ruby 和 Python 中? [复制]【英文标题】:Why is -1 / 2 == -1 in Ruby and Python? [duplicate]为什么 -1 / 2 == -1 在 Ruby 和 Python 中? [复制] 【发布时间】:2020-09-10 23:49:17 【问题描述】:

1/2 实际上是 0 在两种语言中都符合预期,因为它是整数除法。

人们也希望-1/2 的结果为 0。但它是-1! 在 Java、Scala 或 C++ 等其他语言中,它应该是 0。 Ruby 和 Python 会发生什么,为什么?

【问题讨论】:

相关:-1 % 2. 请注意,/ 在 Python 3 中不是整数除法。 【参考方案1】:

这是为所有整数xy != 0 保留(x / y) * y + (x % y) == x 的标识;这就是x % yx 除以y 时的余数的含义。

在 Java 中,整数除法向零舍入,但这意味着余数运算符 % 可能会给出负数结果,这对于大多数用途来说是不方便的。例如,当i 为负数时,表达式arr[i % arr.length] 不保证有效的数组索引。

在 Python 中,如果 y 是正数,那么 x % y 总是给出非负数结果(在从 0y - 1 的范围内),所以为了保留“余数”属性,整数除法有总是向下舍入,不一定是零。

【讨论】:

这仅在使用整数除法时才成立,在 Python 中是通过 // 运算符完成的。在 Python 2 中,/ 与两个整数操作数一起使用时也执行整数除法,但不推荐使用这种用法,而在 Python 3 中,/ 在给定两个整数时使用浮点除法。 @TomKarzes 是的,问题是关于整数除法。【参考方案2】:

在进行整数数学运算时,它基本上是进行取整运算或向下取整。 所以:

1/2 == 0.5 # rounds down to 0

但是

-1/2 == -0.5 # which rounds down to -1

如果您希望结果等于 0,您可以运行以下命令:

int(-1/2)

【讨论】:

以上是关于为啥 -1 / 2 == -1 在 Ruby 和 Python 中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?

为啥当我进入这个目录时,ruby 2.4.0 总是尝试安装?

ruby 2.0,为啥#each_line 变异文件对象

为啥 Enumerable 在 Ruby 中没有长度属性?

为啥学习 Ruby 中的元编程和特征类很重要?

为啥 Kernel#require 在 Ruby 中引发 LoadError?