🐡
PHPの`intdiv()` を使った整数除算の実用例(おつり計算など)
こんにちは、工藤です。
今回は PHP の組み込み関数 intdiv() について、「実務でどう使えるのか?」という視点から、おつり計算のロジックを例に紹介します。
🔸 なぜ intdiv() に注目したのか?
私の前職での話ですが、研修を経て開発実務に携わるようになり、基本文法だけでなく「現場で役立つ小技」に意識が向くようになりました。
その中で見つけたのが intdiv()。
最初は「割り算して整数部分だけ取りたいなら floor() でいいじゃん?」と思っていたのですが、ある課題で意識が変わりました。
🧪 体験談:おつりの最小枚数を計算せよ
研修中に出題された問題のひとつがこれです。
735 円を支払うとき、手元にある 500 円玉・100 円玉・10 円玉・1 円玉を使って、最小の枚数で支払うには何枚になるか?
このとき自分は、$amount / $coin で割って、floor() して切り捨て、そこから $amount -= ... というような処理を書いていました。
でも後でレビューで言われたんです:
「
intdiv()使えば 1 行で済むし、float 絡まないから安全だよ!」
✅ intdiv() の基本構文
intdiv(被除数, 除数)
返り値は 整数型。小数点以下は切り捨てられます。
つまり、floor($a / $b) の安全版・読みやすい版とも言えます。
おつり計算の例
function payCoins($amount)
{
$coins = [500, 100, 10, 1];
$totalCoins = 0;
foreach ($coins as $coin) {
$count = intdiv($amount, $coin);
$amount -= $count * $coin;
$totalCoins += $count;
echo "{$coin}円玉:{$count}枚\n";
}
echo "合計:{$totalCoins}枚\n";
}
実行結果:
500円玉:1枚
100円玉:2枚
10円玉:3枚
1円玉:5枚
合計:11枚
なぜ intdiv() を使うと良いか?
- floor() よりも意図が明確(整数の割り算!)
- 計算結果が必ず int 型 になる(float の誤差を気にしなくていい)
- declare(strict_types=1); 環境でも型エラーが起きづらい
終わりに
実務では、「この処理って本当に必要?」「もっと安全で簡潔なやり方ない?」と考える力が求められます。
intdiv() はその好例でした。
「地味だけど堅実」な関数を、日常のコードに活かす視点はこれからも大切にしていきたいです。
そして今後も、こうした“ニッチな実務視点”を交えた記事を増やしていく予定です。
よければフォローいただけると嬉しいです!
YouTube では動画で Udemy 並に解説してます
- Laravel
- React
- TypeScript
- Javascript
など現場で使える技術を公開してます!
Discussion