💡 今日の3行まとめ
  • 「1個でも余ったらもう1箱必要」のような切り上げには ceil() を使う
  • 「100円未満の端数は切り捨て」のような切り捨てには floor() を使う
  • ceil() と floor() の戻り値は小数(float型)なので、整数で扱うときは (int) をつける

1. 今日のお題とゴール

注文されたドーナツ(7個)を入れる箱の数と、購入金額(1,280円)に対する獲得ポイントを計算して画面に出力します。

  • ドーナツ7個を「1箱6個入り」の箱に詰めるのに必要な箱数を切り上げで求める
  • 購入金額1,280円に対し、「100円につき1ポイント」の獲得ポイントを切り捨てで求める
  • 計算した箱数とポイントをそれぞれ整数で出力する
// 期待する出力例
注文数: 7個 → 必要な箱: 2箱
お会計: 1280円 → 獲得ポイント: 12pt

2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード

❌ やりがちなNGコードBefore
<?php
$items = 7;
$price = 1280;

// 四捨五入(round)を使うと、7÷6=1.16... が「1箱」になり1個入らない!
$boxes  = round($items / 6);
// 1280÷100=12.8 が四捨五入されて「13pt」になり付与しすぎてしまう!
$points = round($price / 100);

echo "必要な箱: {$boxes}箱 / 獲得ポイント: {$points}pt\n";

何でも四捨五入の round() で計算してしまうと、「7個なのに箱が1つしか用意されない」「1,300円未満なのに13ポイント付与される」といった計算ミスが起きてしまいます。

⭕ コピペで動く正解コード(PHP 8.3+)After
<?php
declare(strict_types=1);

// 1. 注文データと計算ルールを用意する
$items       = 7;    // 注文された個数
$boxCapacity = 6;    // 1箱に入る最大個数
$price       = 1280; // お会計金額(円)
$pointUnit   = 100;  // 1ポイント付与するごとの金額(円)

// 2. ceil() で小数点以下を「切り上げ」て必要な箱数を求める
// 7 ÷ 6 = 1.166... → 切り上げて 2箱
$boxes = (int)ceil($items / $boxCapacity);

// 3. floor() で小数点以下を「切り捨て」て獲得ポイントを求める
// 1280 ÷ 100 = 12.8 → 切り捨てて 12pt
$points = (int)floor($price / $pointUnit);

// 4. 結果を出力する
echo "注文数: {$items}個 → 必要な箱: {$boxes}箱\n";
echo "お会計: {$price}円 → 獲得ポイント: {$points}pt\n";

3. ここだけ押さえる!3つのポイント

1不足すると困る計算は ceil() で切り上げる

ceil()(天井=シーリング)は、小数点以下に少しでも端数があれば1つ上の整数へ切り上げます。配送箱の数、イベントのテーブル数、ページネーションの総ページ数などを求めるときに必須の関数です。

2達成した分だけ数える計算は floor() で切り捨てる

floor()(床=フロア)は、小数点以下の端数をすべて切り捨てて1つ下の整数にします。ポイント付与や割引計算、経過した日数・時間の算出などでよく使われます。

3戻り値は float 型なので (int) キャストを添える

PHPの ceil() と floor() は、計算結果が整数でも小数型(float)を返します。そのまま整数として安全に扱えるよう、先頭に (int) をつけて整数型へ変換しておきましょう。

4. 1分ミニチャレンジ

🚀 手を動かしてみよう

正解コードの $items = 7; を $items = 12;(ちょうど2箱分)や $items = 13;(1個余る)に書き換えて実行してみましょう。13個になった瞬間に必要な箱が 3箱 へ切り替わる動きが確認できます。