在處理分頁、分組、價格區間等業務時,常需將數值「向下取整到最近的 N 的倍數」。例如:將 1234 向下取整到 500 的倍數 → 1000;將 999 向下取整到 100 的倍數 → 900。
$result = intval(floor($value / $step)) * $step;
$evalue = 1234;
$step = 500;
$father = intval(floor($evalue / $step)) * $step;
// 計算過程:1234 / 500 = 2.468 → floor = 2 → 2 * 500 = 1000
echo $father; // 輸出 1000
| 業務場景 | 步長 | 範例輸入 | 輸出結果 |
|---|---|---|---|
| 分頁每頁 20 條 | 20 | 45 | 40 |
| 價格區間 100 元 | 100 | 389 | 300 |
| 時間槽 15 分鐘 | 900 (秒) | 5000 | 4500 |
| 網格對齊 50px | 50 | 123 | 100 |
function floorToMultiple($value, $step = 1) {
if ($step <= 0) {
throw new InvalidArgumentException('Step must be positive');
}
return (int)floor($value / $step) * $step;
}
// 使用
echo floorToMultiple(1234, 500); // 1000
echo floorToMultiple(999, 100); // 900
floor() 返回 float,大數值時可能有精度問題,intval() 二次轉換可保險。floor(-1.5) = -2,符合數學定義(向下取整)。若需「向零取整」,改用 intval() 直接截斷。intdiv($value, $step) * $step 替代,純整數運算更高效且無精度風險。「除以步長 → 向下取整 → 乘回步長」是通用的向下對齊算法,簡潔高效,適用於所有需對齊到固定間距的數值處理場景。