この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: 算術演算子
SEOタイトル: PHP 算術演算子の落とし穴(オーバーフロー / ゼロ除算 / 浮動小数誤差 / BCMath)

この記事の要点
  • 基本: + - * / % **。除算 /整数÷整数でも結果は float になる可能性
  • 整数オーバーフロー: PHP_INT_MAX 超えで自動的に float に昇格
  • ゼロ除算: PHP 8 から DivisionByZeroError をスロー(PHP 7 は警告 + INF/NaN)
  • 整数除算は intdiv()剰余% または fmod()(浮動小数用)
  • 高精度計算BCMath / GMP。金額計算で 0.1 + 0.20.3 にならない問題を回避

演算子一覧

演算子名前結果
+加算2 + 35
-減算5 - 23
*乗算4 * 312
/除算10 / 33.333... (float)
%剰余 (整数)10 % 31
**べき乗 (PHP 5.6+)2 ** 101024
-$a符号反転-5-5
+$a数値変換+"42"42 (int)

整数除算と剰余

整数オーバーフローと float 昇格

PHP の int は環境依存(64bit OS では PHP_INT_MAX = 9223372036854775807)。それを超えると自動的に float になります:

ゼロ除算: DivisionByZeroError (PHP 8)

操作PHP 7PHP 8
1 / 0Warning + INFDivisionByZeroError
0 / 0Warning + NANDivisionByZeroError
1 % 0Warning + falseDivisionByZeroError
intdiv(1, 0)DivisionByZeroErrorDivisionByZeroError
fmod(1, 0)Warning + NANWarning + 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 の補正和。