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

PHP 取模運算詳解:% 運算子與 fmod() 的差異、負數規則與浮點數陷阱

     編輯:PHP 綜合知識

兩種取模方式

特性% (整數取模)fmod() (浮點取模)
操作數型別強制轉為 整數保持 浮點數
負數結果符號跟隨 被除數(PHP 行為)跟隨 被除數
精度整數精確浮點精度(約 15-17 位有效數字)
適用場景一般整數運算大整數、浮點數、高精度需求

% 運算子的隱式轉型陷阱

$val = 9.45;
$result = $val * 100;      // 945.0 (浮點)
echo $result % 100;        // 44 ❌

echo intval($result);      // 944 (浮點精度誤差:9.45*100 ≠ 945.000...)
echo fmod($result, 100);   // 45 ✅

原因: 浮點數 9.45 * 100 實際儲存為 944.9999999999999,% 先 intval() 變 944,再取模得 44。

數學定義:MOD(x, y) 與 % 的差異

標準數學 MOD(如 Excel、SQL):

  • 結果符號與 除數 (y) 同號。
  • MOD(9, -8) = -7(除數為負,結果為負)。

PHP %(C 風格):

  • 結果符號與 被除數 (x) 同號。
  • 9 % -8 = 1(被除數為正,結果為正)。
var_dump(9 % -8);   // int(1)
var_dump(-9 % 8);   // int(-1)
var_dump(-9 % -8);  // int(-1)

浮點數取模的四捨五入行為 (fmod)

fmod 遵循 IEEE 754:x - trunc(x/y) * y。

var_dump(fmod(9.0, 1.2));  // float(0.6)  (9 - 7*1.2 = 0.6)
var_dump(fmod(9.0, 2.4));  // float(1.8)  (9 - 3*2.4 = 1.8)

注意:非整除時結果保留浮點小數,非四捨五入。

實用封裝:安全取模函數

function Kmod($bigNumber, $mod) {
    // 支援字串、大整數、浮點數
    return intval(fmod((float) $bigNumber, (float) $mod));
}

// 測試
echo Kmod('16244799483', 9999999); // 4801107
echo Kmod(9.45 * 100, 100);        // 45

最佳實踐建議

  1. 純整數且範圍在平台整數限制內 → 直接用 %。
  2. 涉及大整數(> PHP_INT_MAX)、浮點數、字串數字 → 用 fmod() 並轉 (float)。
  3. 金融/會計計算 → 採用 bcmath 或 gmp 擴展進行任意精度運算,避免浮點誤差。
  4. 需符合數學 MOD 定義(結果同號除數)時 → 自行實現:function math_mod($x,$y){ $r=$x%$y; return $r?$r+abs($y):0; }(簡略版)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved