タイトル: 算術演算子
SEOタイトル: PHP 算術演算子の落とし穴(オーバーフロー / ゼロ除算 / 浮動小数誤差 / BCMath)
| この記事の要点 |
|
演算子一覧
| 演算子 | 名前 | 例 | 結果 |
|---|---|---|---|
+ | 加算 | 2 + 3 | 5 |
- | 減算 | 5 - 2 | 3 |
* | 乗算 | 4 * 3 | 12 |
/ | 除算 | 10 / 3 | 3.333... (float) |
% | 剰余 (整数) | 10 % 3 | 1 |
** | べき乗 (PHP 5.6+) | 2 ** 10 | 1024 |
-$a | 符号反転 | -5 | -5 |
+$a | 数値変換 | +"42" | 42 (int) |
整数除算と剰余
整数オーバーフローと float 昇格
PHP の int は環境依存(64bit OS では PHP_INT_MAX = 9223372036854775807)。それを超えると自動的に float になります:
ゼロ除算: DivisionByZeroError (PHP 8)
| 操作 | PHP 7 | PHP 8 |
|---|---|---|
1 / 0 | Warning + INF | DivisionByZeroError |
0 / 0 | Warning + NAN | DivisionByZeroError |
1 % 0 | Warning + false | DivisionByZeroError |
intdiv(1, 0) | DivisionByZeroError | DivisionByZeroError |
fmod(1, 0) | Warning + NAN | Warning + NAN (例外にならない) |
getMessage();
}
// 事前チェックが王道
if ($denominator !== 0) {
$r = $numerator / $denominator;
}
べき乗とルート
浮動小数の罠
2 進浮動小数は 10 進小数を正確に表現できません。金額計算には絶対に float を使わないのが鉄則です:
BCMath / GMP で高精度計算
インクリメント / デクリメント
FAQ
Q: 10 / 0 を 0 として扱いたい
A: 直接書かず、$x = $b == 0 ? 0 : $a / $b; のように事前チェック。PHP 8 では try/catch も可。
Q: 整数 ÷ 整数 で整数だけ欲しい
A: intdiv($a, $b)。(int)($a / $b) は float 経由で精度を失う可能性あり。
Q: 大量データの集計で float の累積誤差が気になる
A: 金額系なら BCMath。科学計算なら Kahan の補正和。