四大取整函數速查表
| 函數 | 行為 | 回傳型別 | 適用場景 |
ceil() | 向上取整(天花板) | float | 分頁計算、資源配額向上 |
floor() | 向下取整(地板) | float | 分頁總頁數、索引計算 |
round() | 四捨五入(可指定精度) | float | 金額計算、統計顯示 |
intval() | 截斷小數/進制轉換 | int | 型別轉換、ID 處理、進制轉換 |
詳細行為對比
1. ceil() - 向上取整
<?php
echo ceil(3.4) . "\n"; // 4
echo ceil(3.5) . "\n"; // 4
echo ceil(3.9) . "\n"; // 4
echo ceil(-3.4) . "\n"; // -3 (向上 = 向零方向)
echo ceil(-3.9) . "\n"; // -3
// 回傳 float: 4.0, 4.0, 4.0, -3.0, -3.0
2. floor() - 向下取整
<?php
echo floor(3.4) . "\n"; // 3
echo floor(3.5) . "\n"; // 3
echo floor(3.9) . "\n"; // 3
echo floor(-3.4) . "\n"; // -4 (向下 = 遠離零方向)
echo floor(-3.9) . "\n"; // -4
// 回傳 float: 3.0, 3.0, 3.0, -4.0, -4.0
3. round() - 四捨五入
<?php
// 基本用法
echo round(3.4) . "\n"; // 3
echo round(3.5) . "\n"; // 4
echo round(3.6) . "\n"; // 4
// 指定精度(第二參數)
echo round(3.444, 2) . "\n"; // 3.44
echo round(3.445, 2) . "\n"; // 3.45
echo round(3.446, 2) . "\n"; // 3.45
// 負數精度:捨入到十位、百位
echo round(1234, -2) . "\n"; // 1200
// PHP 7.1+ 模式參數(第三參數)
echo round(1.5, 0, PHP_ROUND_HALF_UP) . "\n"; // 2 (預設)
echo round(1.5, 0, PHP_ROUND_HALF_DOWN) . "\n"; // 1
echo round(1.5, 0, PHP_ROUND_HALF_EVEN) . "\n"; // 2 (銀行家捨入)
echo round(2.5, 0, PHP_ROUND_HALF_EVEN) . "\n"; // 2 (銀行家捨入)
4. intval() - 整數轉換/截斷
<?php
// 截斷小數(向零取整)
echo intval(3.4) . "\n"; // 3
echo intval(3.9) . "\n"; // 3
echo intval(-3.4) . "\n"; // -3
echo intval(-3.9) . "\n"; // -3
// 進制轉換(第二參數:來源進制)
echo intval('10', 2) . "\n"; // 2 (二進制)
echo intval('10', 8) . "\n"; // 8 (八進制)
echo intval('10', 16) . "\n"; // 16 (十六進制)
echo intval('a', 16) . "\n"; // 10
echo intval('ff', 16) . "\n"; // 255
// 非數字字串
echo intval('abc') . "\n"; // 0
echo intval('123abc') . "\n"; // 123 (解析前綴數字)
負數行為關鍵差異總結
| 值 | ceil | floor | round | intval |
| 3.4 | 4 | 3 | 3 | 3 |
| 3.5 | 4 | 3 | 4 | 3 |
| -3.4 | -3 | -4 | -3 | -3 |
| -3.5 | -3 | -4 | -4 | -3 |
| -3.6 | -3 | -4 | -4 | -3 |
實務應用場景
分頁計算
$total = 105; // 總筆數
$perPage = 20; // 每頁筆數
$totalPages = (int)ceil($total / $perPage); // 6 頁
// 或純整數運算避免浮點誤差
$totalPages = (($total + $perPage - 1) / $perPage) | 0; // 位運算取整
金額計算(分為單位避免浮點誤差)
$price = 19.99; // 元
$cents = (int)round($price * 100); // 1999 分
// 顯示時
echo 'NT$' . number_format($cents / 100, 2); // NT$19.99
陣列分塊處理
$items = range(1, 100);
$chunkSize = 7;
$chunks = (int)ceil(count($items) / $chunkSize); // 15 組
for ($i = 0; $i < $chunks; $i++) {
$offset = $i * $chunkSize;
$batch = array_slice($items, $offset, $chunkSize);
processBatch($batch);
}
常見陷阱與注意事項
- 浮點數精度:
ceil(2.1 / 0.7) 可能得 4 而非 3,建議乘以 10 的冪次轉整數運算
- 回傳型別:
ceil/floor/round 回傳 float,嚴格比較需 (int) 轉型
- 大數值:超出整數範圍時
intval 回傳不確定結果,使用 floor/ceil 處理浮點大數
- 銀行家捨入:
round() PHP 7.1+ 預設 PHP_ROUND_HALF_EVEN,財務系統需明確指定模式
快速選擇指南
- 需要不小於原值的整數 →
ceil()
- 需要不大於原值的整數 →
floor()
- 需要最接近的整數(可指定小數位) →
round()
- 需要整數型別、截斷小數、或進制轉換 →
intval()