PHP 提供多種數值取整函數,行為差異常導致邏輯錯誤。本文系統對比 floor()、ceil()、round()、intval() 的規則與適用場景。
float floor(float $value) // 返回不大於 value 的最大整數(負數變更小) echo floor(1.6); // 1 echo floor(-1.6); // -2 echo floor(0.60); // 0 echo floor(5.1); // 5 echo floor(-5.1); // -6 echo floor(-5.9); // -6
特點:返回 float 型別、負數方向「遠離零」。
float ceil(float $value) // 返回不小於 value 的最小整數(負數變更大) echo ceil(4.3); // 5 echo ceil(9.999); // 10 echo ceil(-3.14); // -3
特點:返回 float 型別、負數方向「趨向零」。
float round(float $val, int $precision = 0, int $mode = PHP_ROUND_HALF_UP) // 預設四捨五入,precision 可為負數(十位、百位) echo round(3.4); // 3 echo round(3.5); // 4 echo round(3.6); // 4 echo round(1.95583, 2); // 1.96 echo round(1241757, -3); // 1242000 echo round(5.045, 2); // 5.05 echo round(5.055, 2); // 5.06
模式常數:PHP_ROUND_HALF_UP(預設)、PHP_ROUND_HALF_DOWN、PHP_ROUND_HALF_EVEN、PHP_ROUND_HALF_ODD。
int intval(mixed $var, int $base = 10)
// 直接捨棄小數部分,趨向零
echo intval(4.3); // 4
echo intval(4.6); // 4
echo intval(-4.6); // -4
echo intval('abc'); // 0
echo intval('5fd'); // 5
特點:返回 int、字串轉換規則複雜(建議僅用於數值)。
| 函數 | 3.7 | -3.7 | 返回型別 | 典型用途 |
|---|---|---|---|---|
| floor | 3 | -4 | float | 分頁總頁數、向下取整 |
| ceil | 4 | -3 | float | 向上取整、分頁計算 |
| round | 4 | -4 | float | 四捨五入、金額精度 |
| intval | 3 | -3 | int | 強制整數、陣列索引 |
$total = 105; // 總筆數 $per_page = 20; // 每頁筆數 $last_page = ceil($total / $per_page); // 6 頁 // 若用 floor(105/20)=5 會少一頁
echo floor(0.58 * 100); // 57 (非 58!)
// 原因:0.58 無法精確表示為二進制浮點數
// 解決:使用 BCMath 或整數運算
echo floor(bcmul('0.58', '100', 0)); // 58
選擇原則:分頁用 ceil、金額用 round+BCMath、索引用 intval、統計下界用 floor。牢記浮點數精度問題,金融計算務必用 BCMath/GMP。