为啥 -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】:
这是为所有整数x
和y != 0
保留(x / y) * y + (x % y) == x
的标识;这就是x % y
是x
除以y
时的余数的含义。
在 Java 中,整数除法向零舍入,但这意味着余数运算符 %
可能会给出负数结果,这对于大多数用途来说是不方便的。例如,当i
为负数时,表达式arr[i % arr.length]
不保证有效的数组索引。
在 Python 中,如果 y
是正数,那么 x % y
总是给出非负数结果(在从 0
到 y - 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 不同?