与 C 不同,在 Java 中,即使对于负操作数,
x/y
和 x%y
的结果也是明确定义的。令人惊讶的是,它是通过向零舍入定义的,而不是向下舍入(即向负无穷大)舍入。有人利用过这个定义吗?
在大多数情况下我不在乎,但有时我必须解决这个问题,例如,当使用模
array.length
计算索引时。
这不是咆哮,我真的很感兴趣这个定义是否有用途。
如果可以向零舍入,则更容易实现除法例程。通常,涉及负数的除法会被符号翻转,然后对正数进行除法,然后答案再次翻转回来。所以效果自然会趋近于零。
这里有一个例子,它很有用,但作用不大:
maxPage = (rows.length - 1) / ROWS_PER_PAGE
(当
maxPage = 0
时,无需对rows.length = 0
进行特殊处理,假设为ROWS_PER_PAGE > 1
。)
两个整数相除的问题是结果可能是非整数。这与其他三个标准算术运算符(+、-、*)相反。所以你必须解决这个问题。
有多种方法可以做到这一点(截断/向零舍入、下限/上限除法、欧几里德除法)。从数学的角度来看,楼层除法或密切相关的欧几里得除法似乎是最有用的。
然而,楼层除法的一个很大的缺点是它的“行为”不如实数除法运算。特别是,算术重写规则允许人们对除法和乘法重新排序。例如,对于实数除法,
-(x/y)
与 (-x)/y
或 x/(-y)
相同。楼层划分不具有此属性:-(1/2)
与(-1)/2
不同,因为前者产生0
而后者产生-1
。向零舍入的除法确实保留了这种重新排序属性,从而允许更自由地应用经典算术重写规则。