🐡

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
    など現場で使える技術を公開してます!

https://www.youtube.com/@Monsho_

Discussion