为什么整数div和mod要向零舍入?

问题描述 投票:0回答:3

与 C 不同,在 Java 中,即使对于负操作数,

x/y
x%y
的结果也是明确定义的。令人惊讶的是,它是通过向零舍入定义的,而不是向下舍入(即向负无穷大)舍入。有人利用过这个定义吗?

在大多数情况下我不在乎,但有时我必须解决这个问题,例如,当使用模

array.length
计算索引时。

这不是咆哮,我真的很感兴趣这个定义是否有用途。

java integer-division
3个回答
7
投票

如果可以向零舍入,则更容易实现除法例程。通常,涉及负数的除法会被符号翻转,然后对正数进行除法,然后答案再次翻转回来。所以效果自然会趋近于零。


1
投票

这里有一个例子,它很有用,但作用不大:

maxPage = (rows.length - 1) / ROWS_PER_PAGE

(当

maxPage = 0
时,无需对
rows.length = 0
进行特殊处理,假设为
ROWS_PER_PAGE > 1
。)


0
投票

两个整数相除的问题是结果可能是非整数。这与其他三个标准算术运算符(+、-、*)相反。所以你必须解决这个问题。

有多种方法可以做到这一点(截断/向零舍入、下限/上限除法、欧几里德除法)。从数学的角度来看,楼层除法或密切相关的欧几里得除法似乎是最有用的。

然而,楼层除法的一个很大的缺点是它的“行为”不如实数除法运算。特别是,算术重写规则允许人们对除法和乘法重新排序。例如,对于实数除法,

-(x/y)
(-x)/y
x/(-y)
相同。楼层划分不具有此属性:
-(1/2)
(-1)/2
不同,因为前者产生
0
而后者产生
-1
。向零舍入的除法确实保留了这种重新排序属性,从而允许更自由地应用经典算术重写规则。

© www.soinside.com 2019 - 2024. All rights reserved.