必须用Math.ceil(),因分页需“宁多勿少”:Math.round()和parseInt()会漏页,而Math.ceil()确保余数也占1页;总页数公式为Math.ceil(total/pageSize),需防除零、负数及字符串输入,并校验当前页不越界。

用 Math.ceil() 计算总页数,核心是把「总数据量 ÷ 每页条数」向上取整。它天然适合分页场景——哪怕只剩 1 条数据,也要单独占 1 页。
为什么必须用 Math.ceil() 而不是 Math.round() 或 parseInt()?
因为分页要求「宁多勿少」:
- Math.round(7 / 3) → Math.round(2.33) → 2:实际有 7 条、每页 3 条,需要 3 页(3+3+1),但四舍五入会错算成 2 页;
- parseInt(7 / 3) → parseInt(2.33) → 2:直接截断小数,同样漏掉第 3 页;
- Math.ceil(7 / 3) → Math.ceil(2.33) → 3:正确反映「至少要 3 页」。
基础公式与安全写法
总页数 = Math.ceil(total / pageSize),但需防除零和非法输入:
- 确保
pageSize > 0,否则会得Infinity或NaN; - 建议加兜底:
const totalPages = pageSize > 0 ? Math.ceil(Math.max(0, total) / pageSize) : 0;; - 若
total是字符串(如接口返回),先转数字:Math.ceil(Number(total) / pageSize)。
结合当前页码做边界控制
算出总页数后,常需校验当前页是否越界:
- 当前页
currentPage应满足:currentPage = Math.min(Math.max(1, currentPage), totalPages); - 若
total === 0,总页数为 0,此时应设currentPage = 1或清空列表,避免显示空白页。
实际分页计算示例(含边界)
假设接口返回 { list: [...], total: 105, pageSize: 10 }:
- 总页数:
Math.ceil(105 / 10) → 11; - 用户跳转到第 15 页?→ 自动修正为
Math.min(15, 11) → 11; - 用户传了
pageSize = 0?→ 兜底返回 0 页,阻止后续计算。










