PHPにおける数値計算において、割り算は非常に多用される演算の一つです。

しかし、単純な計算であっても、戻り値の型や端数処理、あるいは「ゼロ除算」などの考慮すべきポイントがいくつか存在します。

特にWebアプリケーション開発では、価格計算やページネーションの計算など、正確な割り算の処理が求められる場面が少なくありません。

本記事では、PHPで割り算を行うための基本的な演算子から、余りの取得方法、浮動小数点数の精度管理に至るまで、実務に役立つ知識を整理して解説します。

PHPにおける割り算の基本:スラッシュ演算子

PHPで最も基本的な割り算を行うには、算術演算子である「/」(スラッシュ)を使用します。

この演算子を使用すると、左辺の数値を右辺の数値で割った結果を返します。

PHPの大きな特徴として、整数同士の割り算であっても、割り切れない場合は自動的に浮動小数点数(float)として結果が返されるという点が挙げられます。

他のプログラミング言語では整数同士の計算結果が整数に切り捨てられることもありますが、PHPでは直感的に正確な数値が得られるようになっています。

PHP
<?php
// 整数同士の割り算
$result1 = 10 / 2;
var_dump($result1);

// 割り切れない場合(自動的にfloatになる)
$result2 = 10 / 3;
var_dump($result2);
?>
実行結果
int(5)
float(3.3333333333333)

このように、計算結果に応じて動的に型が変化することを理解しておくことが重要です。

剰余演算子(%)による余りの取得

割り算を行った際の「余り」を取得したい場合は、「%」(パーセント)演算子を使用します。

これは「剰余演算子」と呼ばれ、整数の割り算における余りを算出する際に非常に便利です。

例えば、ある数値が「偶数か奇数か」を判定する場合や、ループ処理で「3回に1回だけ特定の処理を行う」といった制御によく用いられます。

剰余演算子を使用する際、オペランド(左右の数値)は計算前に整数に変換されるという仕様に注意してください。

もし浮動小数点数を含めた余りを正確に計算したい場合は、後述する fmod() 関数を使用する必要があります。

PHP
<?php
$a = 10;
$b = 3;

$remainder = $a % $b;
echo "10を3で割った余りは " . $remainder . " です。";

// 偶数・奇数の判定例
if ($a % 2 === 0) {
    echo "10は偶数です。";
}
?>
実行結果
10を3で割った余りは 1 です。
10は偶数です。

整数としての商を求める:intdiv関数

計算結果の小数点以下を切り捨てて、「整数としての商」のみを取得したい場合には、intdiv() 関数を使用するのが最適です。

前述の「/」演算子では結果が浮動小数点数になる可能性がありますが、intdiv() を使えば明示的に整数(int)型の結果を得ることができます。

従来の手法では floor(10 / 3) のように記述されることもありましたが、PHP 7以降では専用の intdiv() を使うことが推奨されています。

PHP
<?php
// 10 ÷ 3 の整数の商を求める
$quotient = intdiv(10, 3);

echo "10を3で割った商(整数)は " . $quotient . " です。";
var_dump($quotient);
?>
実行結果
10を3で割った商(整数)は 3 です。
int(3)

浮動小数点数の余りを求める:fmod関数

先述した通り、「%」演算子は数値を整数に変換してから計算を行います。

そのため、10.5 % 3 のような計算を行うと、意図しない結果(10 % 3 として処理される)になることがあります。

浮動小数点数を含めた正確な余りが必要な場合は、fmod() 関数を利用しましょう。

PHP
<?php
$x = 10.5;
$y = 3.0;

$mod = fmod($x, $y);
echo "10.5を3.0で割った余りは " . $mod . " です。";
?>
実行結果
10.5を3.0で割った余りは 1.5 です。

計算結果の端数処理(四捨五入・切り捨て・切り上げ)

割り算の結果を特定の桁数で丸めたい場合は、目的の処理に合わせて以下の関数を使い分けます。

関数名処理内容使用例
round()四捨五入round(3.333, 2) → 3.33
ceil()切り上げ(天井関数)ceil(3.1) → 4
floor()切り捨て(床関数)floor(3.9) → 3

特に round() 関数は、第2引数に精度(小数点以下の桁数)を指定できるため、実務での利用頻度が非常に高い関数です。

PHP
<?php
$value = 10 / 3; // 3.3333...

echo round($value, 2); // 小数点第2位まで表示
echo "\n";
echo ceil($value);    // 4
echo "\n";
echo floor($value);   // 3
?>
実行結果
3.33
4
3

厳密な計算が必要な場合:BCMath関数の活用

金融系のシステムなど、極めて高い精度が求められる計算では、通常の「/」演算子では不十分な場合があります。

コンピュータの特性上、浮動小数点数の計算には微小な誤差が含まれる可能性があるためです。

PHPには、任意の精度で計算を行える「BCMath拡張」が用意されており、これを利用することで誤差を排除した計算が可能になります。

割り算には bcdiv() 関数を使用し、第3引数で取得したい小数点以下の桁数を厳密に指定します。

PHP
<?php
// 文字列として数値を渡すことで精度を保つ
$a = '10.0000000001';
$b = '2';

// 小数点以下10桁まで計算
$result = bcdiv($a, $b, 10);
echo $result;
?>
実行結果
5.0000000000

BCMath関数は数値を「文字列」として扱うため、浮動小数点数特有の丸め誤差の影響を受けません。

ゼロ除算(Division by Zero)への対策

プログラムにおいて、数値を 0 で割る「ゼロ除算」は重大なエラーの原因となります。

PHP 8.0以降では、整数を0で割ろうとしたり剰余を求めようとしたりすると DivisionByZeroError 例外が発生します。

これを回避するためには、計算を行う前に除数が 0 ではないかを確認するか、try-catch 構文を用いて例外を適切にハンドリングする必要があります。

PHP
<?php
function safe_divide($num, $divisor) {
    if ($divisor === 0) {
        return "計算不可(0除算)";
    }
    return $num / $divisor;
}

echo safe_divide(10, 0);
?>
実行結果
計算不可(0除算)

なお、浮動小数点数として 0 で割った場合は例外ではなく INF(無限大)が返される仕様となっていますが、基本的には事前にチェックを行うのが安全な設計です。

まとめ

PHPでの割り算は、用途に応じて最適な方法を選択することが重要です。

単純な計算には / 演算子、余りの算出には % 演算子、整数の商には intdiv() を使い分けましょう。

また、計算結果の丸め処理やゼロ除算のチェック、高精度なBCMath関数の利用など、実務レベルではエラーや誤差への配慮が欠かせません。

本記事で整理した内容を参考に、バグの少ない正確な数値計算を実装してください。