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

タイトル: 算術演算子
SEOタイトル: PHP 算術演算子完全ガイド

この記事の要点
  • PHP の算術演算子: + - * / % ** (累乗は PHP 5.6+)
  • 除算は常に float: 5 / 2 = 2.5。整数除算は intdiv(5, 2) = 2
  • Type Juggling: "5" + 3 = 8 (PHP 7 は警告なし、PHP 8 で Deprecated)
  • BCMath / GMP で任意精度・大きな数の計算が可能
  • 0 除算: int の /DivisionByZeroError (PHP 8+)、float は INF / NAN

基本の算術演算子

$a = 10; $b = 3;

echo $a + $b;   // 13
echo $a - $b;   // 7
echo $a * $b;   // 30
echo $a / $b;   // 3.3333333333333  ★ 常に float
echo $a % $b;   // 1
echo $a ** $b;  // 1000  (累乗, PHP 5.6+)

// 整数除算は intdiv (PHP 7+)
echo intdiv(10, 3);   // 3
echo intdiv(-10, 3);  // -3 (0 方向に切り捨て)

// 浮動小数の剰余
echo fmod(5.5, 2);    // 1.5

除算の振る舞い (Java/PHP/Pythonの違い)

PHPJavaPython 3
5 / 22.5 (float)2 (int)2.5 (float)
整数除算intdiv(5, 2)int 同士の /5 // 2
累乗5 ** 2Math.pow(5, 2)5 ** 2
0 除算 (int)DivisionByZeroError (PHP 8+)ArithmeticExceptionZeroDivisionError
0 除算 (float)INF / NANInfinity / NaNZeroDivisionError

Type Juggling (緩い型変換)

// PHP は文字列を自動で数値に変換
var_dump('5' + 3);       // int(8)
var_dump('5.5' + 3);     // float(8.5)
var_dump('5abc' + 3);    // PHP 7: int(8) + Warning / PHP 8: TypeError
var_dump('abc' + 3);     // PHP 7: int(3) + Warning / PHP 8: TypeError

// PHP 8: 非数値文字列の算術は Deprecated
// → 明示キャストを推奨
$x = (int) '5' + 3;          // 8
$x = intval('5abc') + 3;     // 8
$x = (int) filter_var($s, FILTER_SANITIZE_NUMBER_INT) + 3;

関連関数: 丸め / 切り捨て / 切り上げ

echo round(3.5);     // 4
echo round(2.5);     // 3 (Banker's Rounding ではない、四捨五入)
echo round(3.456, 2);   // 3.46
echo round(1234, -2);   // 1200 (10の位以下を丸め)

echo floor(3.9);     // 3 (常に下げる)
echo ceil(3.1);      // 4 (常に上げる)

// 絶対値
echo abs(-3.14);     // 3.14

// 累乗・平方根
echo pow(2, 10);     // 1024 (** と同じ)
echo sqrt(16);       // 4

// 最大・最小
echo max(1, 5, 3);   // 5
echo min([1, 5, 3]); // 1

// 0埋め / 桁区切り
echo number_format(1234567.891, 2);   // '1,234,567.89'
echo str_pad('5', 3, '0', STR_PAD_LEFT);  // '005'

0 除算と特殊値

// PHP 8+ では int / 0 が例外に
try {
    echo 10 / 0;
} catch (DivisionByZeroError $e) {
    /* Division by zero */
}

// 浮動小数の 0 除算 → INF / NAN
$inf = 1.0 / 0;     // PHP 7: INF / PHP 8: 例外
$nan = 0.0 / 0;     // PHP 7: NAN / PHP 8: 例外
// ※ PHP 8+ では float でも例外なので意外に注意

// 例外を回避するなら事前チェック
$result = ($b === 0 || $b === 0.0) ? 0 : ($a / $b);

// INF / NAN 判定
var_dump(is_infinite(INF));   // true
var_dump(is_nan(NAN));        // true

BCMath で任意精度

// 金額計算 (0.1 + 0.2 問題)
echo 0.1 + 0.2;              // 0.3 (見た目)
var_dump(0.1 + 0.2 == 0.3);  // false !
var_dump(0.1 + 0.2);         // float(0.30000000000000004)

// BCMath なら正確
echo bcadd('0.1', '0.2', 2);   // '0.30'
echo bcsub('1.50', '0.30', 2); // '1.20'
echo bcmul('1.5', '0.1', 2);   // '0.15'
echo bcdiv('10', '3', 4);      // '3.3333'
echo bcmod('10', '3');         // '1'
echo bcpow('2', '100');        // '1267650600228229401496703205376'

// スケール (小数桁) はデフォルト 0
bcscale(4);   // 全関数のデフォルトに反映

GMP で巨大な整数

// 1000 桁の階乗
$n = gmp_init(1);
for ($i = 2; $i <= 100; $i++) {
    $n = gmp_mul($n, $i);
}
echo gmp_strval($n);   // 100! の正確な値

// 暗号系
$big1 = gmp_init('123456789012345678901234567890');
$big2 = gmp_init('987654321098765432109876543210');
echo gmp_strval(gmp_mul($big1, $big2));

剰余 (%) の符号

// PHP は被除数の符号に従う (Java と同じ)
echo  7 %  3;   //  1
echo -7 %  3;   // -1
echo  7 % -3;   //  1
echo -7 % -3;   // -1

// 正の剰余が欲しい (巡回バッファ用)
function pmod(int $a, int $m): int {
    return (($a % $m) + $m) % $m;
}
echo pmod(-1, 5);   // 4

パフォーマンスメモ

  • 整数演算 > 浮動小数演算 > BCMath/GMP
  • 金額は整数の最小単位 (円なら 1) で持つのも実用的 (float の誤差回避 + 高速)
  • ループ内の pow($x, 2) より $x * $x の方が速い
  • $x % 2 == 0 より ($x & 1) == 0 の方がわずかに速い (が可読性優先)

FAQ

Q: 5 / 2 が PHP では 2.5、Java では 2 なのはなぜ?
A: PHP は除算結果が割り切れないなら常に float に格上げ。整数除算したいなら intdiv()

Q: 金額計算で float を使っていいか?
A: 推奨しません。BCMath か「最小単位で整数管理」(円なら円単位の int) が定石。

Q: 0.1 + 0.2 == 0.3 が false なのはバグ?
A: バグではなく IEEE 754 浮動小数の仕様。abs($a - $b) < PHP_FLOAT_EPSILON で比較するか BCMath を使ってください。