直接用 % 算当前页偏移位置可以,但不能用 % 算总页数或当前页码;总页数须用 Math.ceil(totalCount / pageSize),% 仅适用于末页条数计算或末页判断等特定场景。
页码计算中
该不该用?先说结论
直接用
算当前页在总页数中的“偏移位置”可以,但**不能用
直接算总页数或当前页码**。常见错误是写成
——这得到的是余数,不是页数,结果永远小于
,完全不对。
才是算总页数的正解
总页数本质是“向上取整的分组数”,和取模无关。JavaScript 中最稳妥的是:
注意几个实际坑点:
为
时,
得
,符合预期(无数据就 0 页)
如果后端返回的是整数除法截断结果(比如 Java 的
),要先转
再
,否则
得
而非
某些语言如 Python 3 的
是向下取整,
可替代
,但可读性差、易漏减 1
什么时候真正需要
?只在“算当前页最后一条数据序号”或“判断是否末页”时
例如:已知
、
、
,想确认第 3 页是否显示满 10 条:
但如果要算“本页实际条数”,就得用
:
这里的关键逻辑是:
只在最后一页有意义,且当
能被
整除时结果为
,需特殊处理为
—— 所以更安全的写法是:
或者统一用
,完全避开
的边界问题
前端分页控件里
容易引发索引错位
比如用
渲染页码按钮,再对每个
做
实现“每 5 个页码一组”,看似方便,但一旦
不是 5 的倍数,最后一组数量不固定,UI 对齐和点击响应容易混乱。
更可控的做法是明确分段逻辑:
这里没出现
,靠加减和边界限制来保证始终显示最多 5 个连续页码,且当前页居中(或靠边)。强行套
反而让起始计算变脆弱。
取模运算本身很干净,但它解决的是“周期性余数”问题,不是“分组计数”问题。分页的核心是区间划分和边界判断,别让
带偏了方向。
%%%totalPages = totalCount % pageSizepageSizeMath.ceil(totalCount / pageSize)const totalPages = Math.ceil(totalCount / pageSize);totalCount0Math.ceil(0 / pageSize)0int / intdoubleMath.ceil7 / 512//(totalCount + pageSize - 1) // pageSizeceil%currentPage = 3pageSize = 10totalCount = 27const lastItemIndex = currentPage * pageSize; // 30(从 1 开始计的全局序号)const isLastPage = lastItemIndex >= totalCount; // false%const itemsOnThisPage = (currentPage === totalPages) ? totalCount % pageSize : pageSize;totalCount % pageSizetotalCountpageSize0pageSizeitemsOnThisPage = (currentPage === totalPages) ? (totalCount % pageSize || pageSize) : pageSizeMath.min(pageSize, totalCount - (currentPage - 1) * pageSize)%%Array.from({ length: totalPages })ii % 5totalPagesconst start = Math.max(1, Math.min(currentPage - 2, totalPages - 4));const end = Math.min(totalPages, start + 4);%%%