Java中的整数除法

30

这可能是一个愚蠢的问题,但我在Java文档中找不到答案。如果我声明两个整数然后将它们相除,会发生什么?它们首先被转换为floats/doubles,然后除法运算完成后再转换回integer吗?或者说这种除法是以整数的方式进行的?

此外,根据实验结果,整数除法似乎会向零取整(即3/2=1-3/2=-1)。我的理解是正确的吗?


它们被划分为整数。而且“-3/2 == -1”。 - Andy Turner
简单来说,它们被分割了,任何小于完整 int 的部分都会被截断。 - Marshall Tigerus
@Keiwan 不是向下取整除法。 “Floor”表示向下舍入,但Java除法始终朝零方向。对于负数,这与向下取整除法相反。 - Dawood ibn Kareem
@DavidWallace 是的,我不应该把它称为 floor division,因为这是一个 Java 问题。似乎我有点混淆了,因为在其他一些编程语言(如 Python、Wolfram Language)中,“integer division” 与 floor division 相同。但如果我可以挑剔一下:你说“Floor 意味着向下取整”,但在技术上,在 Java 中 rounding [DOWN](https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html#enum.constant.summary)意味着朝零方向舍入,而 UP 则是远离零 :) - Keiwan
是的,在Java中它的命名不准确。我指的是数学意义上的“下降”。 - Dawood ibn Kareem
显示剩余3条评论
2个回答

38

它们正在整数算术中被分割。因此,将整数a除以整数b,你可以得到b适合a的次数。同时,a%b将给出除法的余数。所以(a / b) * b + a % b = a


15

Java会自动转换类型:

"它将int自动转换为double。即使没有涉及到int,它也会将short和byte转换为int,这在你想进行short或byte算术运算时需要不断烦人的强制转换。 它将基本数据类型自动转换为包装类,反之亦然,用于装箱和拆箱。" - user2357112

Java 从不在没有您指定的情况下强制转换任何内容。

但是 integer / integer = integer

此外,它总是截断结果。 因此,如果浮点数结果为0.999999,整数除法仍将返回0。


不,它总是朝零舍入。 - Andy Turner
我是指那个,抱歉。 - Simon Kirsten
5
“Java从不在没有指定的情况下进行强制类型转换” - 实际上它确实这样做了。例如,它会自动将整型转换为双精度浮点数;当涉及到short或byte运算时,即使没有涉及整型,它也会将它们自动转换为整型,导致你想要进行short或byte运算时需要经常进行繁琐的强制类型转换;此外,为了进行装箱和自动装箱,它会自动将基本数据类型转换为包装类类型,反之亦然。 - user2357112
1
double x = 15.9d / 4; - jason44107
为了给“Java从不在没有指定的情况下进行任何转换”添加另一个反例:在某些结构中,Java甚至会执行缩小转换而无需显式转换。 long v = 0; v += 3.14; 没有错误,甚至没有警告。 - Matt Whitlock
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接