在 PHP 開發中,數值處理是常見需求。針對浮點數取整,PHP 提供三個核心函數:round()(四捨五入)、ceil()(無條件進位)與 floor()(無條件捨去)。本文透過實際範例說明三者差異與適用情境。
| 函數 | 說明 | 語法 |
|---|---|---|
round() | 四捨五入取整,可指定精確度 | round(float $num, int $precision = 0, int $mode = PHP_ROUND_HALF_UP) |
ceil() | 無條件進位,回傳大於或等於該數的最小整數 | ceil(float $num) |
floor() | 無條件捨去,回傳小於或等於該數的最大整數 | floor(float $num) |
以下程式隨機產生一個圓的面積(100~200),反推半徑並分別套用三種取整方式:
<?php
$s = rand(100, 200); // 隨機面積
$pi = pi(); // 圓周率
$r = sqrt($s / $pi); // 計算半徑(浮點數)
$qz1 = round($r); // 四捨五入
$qz2 = ceil($r); // 進一法
$qz3 = floor($r); // 捨去法
echo "隨機產生的圓的面積為:{$s}<br>";
echo "計算出的圓的半徑為:{$r}<br>";
echo "四捨五入取整後:{$qz1}<br>";
echo "進一法取整後:{$qz2}<br>";
echo "捨去法取整後:{$qz3}<br>";
?>
隨機產生的圓的面積為:150 計算出的圓的半徑為:6.9098829894267 四捨五入取整後:7 進一法取整後:7 捨去法取整後:6
round() 可接受第二個參數指定小數位數,第三個參數控制 .5 的處理模式:
<?php
$val = 3.14159;
echo round($val, 2); // 3.14(保留兩位小數)
echo round($val, 0); // 3(預設四捨五入)
echo round(1.5, 0, PHP_ROUND_HALF_UP); // 2(預設模式)
echo round(1.5, 0, PHP_ROUND_HALF_DOWN); // 1(捨去 .5)
echo round(1.5, 0, PHP_ROUND_HALF_EVEN); // 2(銀行家捨入:偶數優先)
echo round(2.5, 0, PHP_ROUND_HALF_EVEN); // 2
?>
round($amount, 2) 保留分位;特定會計規則可能要求 PHP_ROUND_HALF_EVEN。ceil($total / $perPage) 取得總頁數(有餘數就多一頁)。floor($index / $groupSize) 計算群組索引。floor(mt_rand() / mt_getrandmax() * $count) 產生 0~$count-1 的整數索引。round(2.675, 2) 可能回傳 2.67 而非 2.68,因二進位無法精確表示。嚴謹金融計算請使用 BCMath 或 GMP 擴展。ceil() 與 floor() 回傳型別為 float,若需整數請搭配 (int) 強制轉型。ceil(-1.2) = -1,floor(-1.2) = -2,round(-1.5) = -2。掌握 round、ceil、floor 三函數的差異,能讓數值處理更精準、符合業務邏輯。記得根據「是否保留小數」、「.5 如何處理」、「正負數行為」選擇正確函數,必要時善用 BCMath 避免精度誤差。