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

如果结果必须是int,为什么Java编译器允许int/int除法?,java,pageable,Java,Pageable,我想根据表元素的条目索引提供实际页面。我使用PageRequest.ofint页面,int大小 我有一个向下传递给函数的索引和一个恒定的PAGESIZE_搜索,它是50 我想根据以下索引传递当前页面: PageRequest.of((int) index/PAGESIZE_SEARCH, PAGESIZE_SEARCH) 我的想法IntelliJ Ultimate 2020.1.1将我的选角变灰,并暗示将“索引”选为“int”是多余的。如果我删除强制转换,即使编译器也会接受它,而且我也不会得到

我想根据表元素的条目索引提供实际页面。我使用PageRequest.ofint页面,int大小

我有一个向下传递给函数的索引和一个恒定的PAGESIZE_搜索,它是50

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

PageRequest.of((int) index/PAGESIZE_SEARCH, PAGESIZE_SEARCH)
我的想法IntelliJ Ultimate 2020.1.1将我的选角变灰,并暗示将“索引”选为“int”是多余的。如果我删除强制转换,即使编译器也会接受它,而且我也不会得到运行时异常


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

该部门并非不安全;它做的正是它应该做的

将两个整数除法称为整数除法,它只返回两个数不带余数的除法结果

此外,正如评论中指出的,实际上您是在将索引转换为int,而不是index/PAGESIZE\u搜索-考虑使用括号更精确:int-index/PAGESIZE\u搜索


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

从数学上讲,整数在除法下不是闭合的,这意味着将两个任意整数(如3和5)除的结果可能会导致无法用整数表示的结果。每一组数学数字都是N,ℤ, ℚ, ℝ, ℂ 有一定的局限性,这些集合在计算机中的每一种表示形式也有局限性。理解这些局限性是一个相当重要的问题

Wrt。两个整数的除法不是闭合的,从数学上讲,你可以用五种不同的方法来处理这个问题:

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

整数除法向0舍入。也就是说,在二进制数字提升§5.6.2之后为整数操作数n和d生成的商是一个整数值q,其大小在满足| d的情况下尽可能大⋅ q|≤ |n |。此外,当| n |时,q为正≥ |d |和n与d具有相同的符号,但当| n |时q为负≥ |d |和n以及d有相反的符号

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


此外,事实上,你并没有把分割的结果投射到int中。你只是向int投索引。抛出是不相关的和冗余的,因为整数分割返回一个int,如上所述。

为什么你认为它不安全?这种行为很明确。它执行整数除法。你说得对。我的错。我来自其他编程语言,没有阅读java规范。ThanksIt很有用,在许多情况下,它确实做了需要做的事情。注意:所有的数值运算都有限制,并且你需要知道它们能够正确地使用它们。@ LeaCHIM其他编程语言也提供整数除法,尽管有些提供了不同的操作符。例如,几种语言使用整数除法来进行相同的设计选择:C、C和C++。