首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 四捨五入、無條件進位與捨去函數完整比較:round、ceil、floor

     編輯:PHP 相關知識

前言

在 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() 的精確度與模式控制

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 的整數索引。

注意事項

  1. 浮點數精度問題:round(2.675, 2) 可能回傳 2.67 而非 2.68,因二進位無法精確表示。嚴謹金融計算請使用 BCMath 或 GMP 擴展。
  2. ceil() 與 floor() 回傳型別為 float,若需整數請搭配 (int) 強制轉型。
  3. 負數行為:ceil(-1.2) = -1,floor(-1.2) = -2,round(-1.5) = -2。

總結

掌握 round、ceil、floor 三函數的差異,能讓數值處理更精準、符合業務邏輯。記得根據「是否保留小數」、「.5 如何處理」、「正負數行為」選擇正確函數,必要時善用 BCMath 避免精度誤差。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved