| 函數 | 行為 | 回傳型別 | 適用場景 |
|---|---|---|---|
floor() | 向下取整(捨去小數) | float | 分頁計算、索引邊界、價格向下取整 |
ceil() | 向上取整(進位) | float | 分頁總頁數、資源配額向上、最小單位計算 |
round() | 四捨五入,支援精度 | float | 金額計算、統計顯示、科學計算 |
float floor(float $value)
// 回傳不大於 value 的最大整數(以 float 型別)
echo floor(4.3); // 4
echo floor(9.999); // 9
echo floor(-4.3); // -5(注意負數方向)
注意:回傳 float 而非 int,因為 float 範圍大於 int。若需整數可搭配 (int) 或 intval()。
float ceil(float $value)
// 回傳不小於 value 的最小整數
echo ceil(4.3); // 5
echo ceil(9.999); // 10
echo ceil(-4.3); // -4
float round(float $val, int $precision = 0, int $mode = PHP_ROUND_HALF_UP)
// $precision:小數位數(正數=小數位、負數=十位百位...)
// $mode:PHP_ROUND_HALF_UP(預設)、HALF_DOWN、HALF_EVEN、HALF_ODD
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(3.6, 0); // 4
echo round(1.95583, 2); // 1.96
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06(銀行家進位規則)
echo round(1241757, -3); // 1242000(千位四捨五入)
PHP 浮點數遵循 IEEE 754,存在精度誤差:
echo round(2.675, 2); // 2.67 而非預期 2.68
解決方案:
bcdiv(bcmul($val, '100', 10), '1', 0) / 100$totalItems = 105;
$perPage = 20;
$totalPages = (int)ceil($totalItems / $perPage); // 6 頁
$price = 199.999;
echo 'NT$' . number_format(round($price, 2), 2); // NT$200.00
$rate = 100 / 3;
echo round($rate, 1) . '%'; // 33.3%
floor/ceil,語意明確round,指定 $precisionnumber_format,區分「計算」與「顯示」