为什么 Ruby 和 Python 中的 -1 / 2 == -1?
Why is -1 / 2 == -1 in Ruby and Python?
1/2
实际上在两种语言中都是 0
,因为它是整数除法。
人们会期望 -1/2
的结果也为 0。但是是-1
!
在 Java、Scala 或 C++ 等其他语言中,它应该是 0
。
Ruby 和 Python 中发生了什么,为什么?
这是为所有整数x
和y != 0
保留(x / y) * y + (x % y) == x
的同一性;这就是 x % y
是 x
除以 y
的余数的意思。
在 Java 中,整数除法向零舍入,但这意味着余数运算符 %
可以给出负结果,这对大多数用途来说是不方便的。例如,当 i
为负数时,表达式 arr[i % arr.length]
不能保证数组索引有效。
在Python中,如果y
为正则x % y
总是给出non-negative结果(范围从0
到y - 1
),因此为了保留“余数”属性,整数除法必须始终向下取整,不一定向零取整。
在做整数运算的时候,基本上都是做floor运算,或者说向下取整。
所以:
1/2 == 0.5 # rounds down to 0
但是
-1/2 == -0.5 # which rounds down to -1
如果您希望结果等于 0,您可以运行以下操作:
int(-1/2)
1/2
实际上在两种语言中都是 0
,因为它是整数除法。
人们会期望 -1/2
的结果也为 0。但是是-1
!
在 Java、Scala 或 C++ 等其他语言中,它应该是 0
。
Ruby 和 Python 中发生了什么,为什么?
这是为所有整数x
和y != 0
保留(x / y) * y + (x % y) == x
的同一性;这就是 x % y
是 x
除以 y
的余数的意思。
在 Java 中,整数除法向零舍入,但这意味着余数运算符 %
可以给出负结果,这对大多数用途来说是不方便的。例如,当 i
为负数时,表达式 arr[i % arr.length]
不能保证数组索引有效。
在Python中,如果y
为正则x % y
总是给出non-negative结果(范围从0
到y - 1
),因此为了保留“余数”属性,整数除法必须始终向下取整,不一定向零取整。
在做整数运算的时候,基本上都是做floor运算,或者说向下取整。 所以:
1/2 == 0.5 # rounds down to 0
但是
-1/2 == -0.5 # which rounds down to -1
如果您希望结果等于 0,您可以运行以下操作:
int(-1/2)