數值取整是高頻需求,PHP 提供四個核心函數,行為各異。本文通過表格、代碼、邊界測試全方位對比,助你精準選型。
| 函數 | 行為 | 返回類型 | 典型場景 |
|---|---|---|---|
ceil | 向上取整(進一法) | float | 分頁總頁數、向上計費 |
floor | 向下取整(捨去法) | float | 向下計費、索引計算 |
round | 四捨五入,可指定精度 | float | 金額顯示、評分計算 |
intval | 截取整數部分(向零取整) | int | 類型轉換、ID 解析 |
<?php
echo ceil(4.3); // 5
echo ceil(9.999); // 10
echo ceil(-4.3); // -4 (注意:負數「向上」是趨向 0)
echo ceil(5); // 5
// 分頁經典用法
$total = 100;
$perPage = 15;
$lastPage = (int)ceil($total / $perPage); // 7
<?php
echo floor(0.60); // 0
echo floor(0.40); // 0
echo floor(5); // 5
echo floor(5.1); // 5
echo floor(-5.1); // -6 (負數「向下」是遠離 0)
echo floor(-5.9); // -6
<?php
echo round(0.60); // 1
echo round(0.50); // 1 (.5 進位,PHP 採用「銀行家捨入」?實測 0.5→1)
echo round(0.49); // 0
echo round(-4.40); // -4
echo round(-4.60); // -5
// 精度控制
echo round(3.14159, 2); // 3.14
echo round(3.14159, 3); // 3.142
echo round(12345, -2); // 12300 (負精度:十位、百位捨入)
// 注意:浮點數精度問題
echo round(2.675, 2); // 2.67 而非 2.68 (二進制無法精確表示 2.675)
// 金額計算建議用 bcmath 或 integer(分) 存儲
<?php
echo intval(4.3); // 4
echo intval(4.9); // 4
echo intval(-4.9); // -4 (向零取整)
// 字符串轉換
echo intval('42'); // 42
echo intval('5abc'); // 5 (從左解析數字直到非數字)
echo intval('abc'); // 0
echo intval('0xFF'); // 0 (不識別 0x 前綴,需用 intval('FF', 16))
echo intval('FF', 16); // 255 (指定進制 base)
// 進制轉換
echo intval('100', 2); // 4
echo intval('77', 8); // 63
值 | ceil | floor | round | intval
--------|------|-------|-------|-------
4.3 | 5 | 4 | 4 | 4
4.5 | 5 | 4 | 5 | 4
4.8 | 5 | 4 | 5 | 4
-4.3 | -4 | -5 | -4 | -4
-4.5 | -4 | -5 | -5 | -4
-4.8 | -4 | -5 | -5 | -4
ceil/floor/round 返回 float,需 (int) 強轉用於嚴格類型場景(如數組鍵、strict_types)。bcmath 任意精度庫。round() 新增 PHP_ROUND_HALF_EVEN 模式,金融場景可用 round($val, 2, PHP_ROUND_HALF_EVEN)。'5abc' → 5,'abc' → 0,驗證 ID 時優先用 filter_var($id, FILTER_VALIDATE_INT)。ceilfloor 或 intvalround($val, 2)(int)$_GET['id'] 或 intval($_GET['id'])(同義,前者更快)