| 特性 | % (整數取模) | 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(如 Excel、SQL):
MOD(9, -8) = -7(除數為負,結果為負)。PHP %(C 風格):
9 % -8 = 1(被除數為正,結果為正)。var_dump(9 % -8); // int(1)
var_dump(-9 % 8); // int(-1)
var_dump(-9 % -8); // int(-1)
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
%。fmod() 並轉 (float)。bcmath 或 gmp 擴展進行任意精度運算,避免浮點誤差。function math_mod($x,$y){ $r=$x%$y; return $r?$r+abs($y):0; }(簡略版)。