做分页,总条数 47,每页 10 条,算出来 4.7 页。直接截断成 4,末页的 7 条数据就没了。

js向上取整就用 Math.ceil

js向上取整用 Math.ceil,不管小数部分是多少,都往大的方向进一位。Math.ceil(4.1) 得 5,Math.ceil(4.9) 也得 5,Math.ceil(4) 还是 4。

const pages = Math.ceil(total / pageSize);

分页、算页码、算需要几个盒子,都是这个套路。注意 total 为 0 时结果是 0,页面上要单独处理成「暂无数据」,不然会显示第 0 页。

按倍数向上取整

有时候不是取整数,而是取到 0.5 或 10 的倍数。公式是 Math.ceil(n / step) * step,比如价格按 0.5 元进位,step 就传 0.5。

浮点数会有精度问题,0.1 加 0.2 不等于 0.3。金额相关的计算先换成整数分,再取整,能少很多对不上账的麻烦。

它和 round、floor 不是一回事

  • Math.round(4.5) 是 5,Math.round(4.4) 是 4,四舍五入
  • Math.floor(4.9) 是 4,永远往下取
  • Math.ceil(-4.1) 是 -4,负数也往大的方向走

负数这一点容易踩坑。向上取整不是「去掉小数」,而是往数轴右边靠,所以 -4.1 会变成 -4,不是 -5。

用 parseInt 取整则是直接砍掉小数,4.9 得 4,-4.9 得 -4,看着和 floor 一样,但遇到字符串和大数会有别的坑,别混着用。

还有一种写法是 (n | 0),它只适用于 32 位以内的整数,超过范围会溢出,别拿它处理大数。可读性也不如 Math.floor。

数组长度除以每页条数,结果可能是 0.5 这种,先取整再渲染,不然循环条件会多跑一次或者少跑一次。

写工具函数时,把 step 的默认值设成 1,调用方只传数字也能用。边界值 0、负数、NaN 各测一遍,省得上线后才发现。

如果页数用来渲染页码按钮,记得再和总页数取最小值,防止数据变动时出现空页。

记住一句:算页数、算份数用 Math.ceil,算数组下标用 Math.floor,要四舍五入才用 round。