繁体   English   中英

如果结果必须是 int,为什么 Java 编译器允许 int/int 除法?

[英]Why does the Java compiler allow int/int division if the result must be an int?

我想根据表格元素的条目索引提供实际页面。 我使用PageRequest.of(int page, int size)

我有传递给 function 的index和一个常量PAGESIZE_SEARCH ,它是 50。

我想根据索引传递当前页面如下:

PageRequest.of((int) index/PAGESIZE_SEARCH, PAGESIZE_SEARCH)

我的想法(IntelliJ Ultimate 2020.1.1)使我的投射变灰并暗示Casting 'index' to 'int' is redundant 如果我删除强制转换,即使编译器接受它,我也不会得到运行时异常。

为什么是这样? 那里的分区不安全吗? 任何解释将不胜感激。

该部门并非不安全; 它完全按照它应该做的那样做。

将两个整数相除称为 integer 除法,只返回两个数字相除的结果,没有余数。

此外,正如评论中所指出的,您实际上是将index转换为 int,而不是index/PAGESIZE_SEARCH - 考虑更精确地使用括号: (int) (index / PAGESIZE_SEARCH)

编辑:您可以在此处阅读有关此主题的更多信息。

从数学上讲,整数在除法下不是闭合的,这意味着将两个任意 integer (如 3 和 5)相除的结果可能会导致 integer 无法表示的结果。 每个数学数字集合(无论是 N、ℤ、ℚ、ℝ、ℂ)都有一定的局限性,并且这些集合在计算机中的每个表示也有局限性。 了解这些限制是很重要的一点。

写。 两个整数的除法不被关闭,你可以用五种不同的方式处理这个问题,从数学上讲:

  • 使除法部分 function。 这对于必须处理任意输入的编程语言来说是不可取的。 每次尝试对未定义除法的数字进行除法时,是否都会出现算术异常? 不是一个很好的方法。
  • 将 function 从 integer 除以实数。 这实际上是您可以使用的一种方法,但实数无法在计算硬件中精确表示,因此只能在近似解中。 它当然可以以这种方式实现编程语言,但实际上您更有可能对 integer 结果感兴趣。
  • 以分数结果 (Q) 形式给出答案。 例如 3/5 变为 ⅗,有时表示为元组 (3,5)。 您可以在某些编程语言中执行类似的操作,例如 Haskell。
  • 给出商和余数的答案。 一些编程语言会这样做,但是 Java 不支持元组类型,也不支持多个返回值,所以这个就out了。 这有时称为欧几里得除法
  • 只给出商作为答案,丢弃余数。 这通常称为integer 除法,是 Java 实现的。 您可以通过相关的操作,即模运算符%来恢复余数。

JLS 在§15.7.2中指定了除法的工作方式:

Integer 除法向 0 舍入。也就是说,在二进制数值提升(第 5.6.2 节)之后为整数操作数 n 和 d 生成的商是 integer 值 q,其幅度尽可能大,同时满足 |d ⋅ q| ≤ |n|。 此外,当 |n| 时 q 为正 ≥ |d| 并且 n 和 d 具有相同的符号,但是当 |n| 时 q 为负 ≥ |d| n 和 d 符号相反。

有一种特殊情况不满足此规则:如果被除数是其类型可能最大量级的负 integer,除数为 -1,则 integer 发生溢出,结果等于被除数。 尽管溢出,在这种情况下不会抛出异常。 另一方面,如果 integer 除法中除数的值为 0,则引发 ArithmeticException。

此外,您实际上并没有将除法的结果转换为int 只是index转换为int 演员表是无关紧要的和多余的,因为 integer 部门返回一个int ,如上所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM