[PHP] 百分率(パーセント)の比率を求める方法

3 min read

関数化して柔軟に対応する必要があったのでメモ。

比率の計算方法

算数の問題であるが重要な部分なので記述しておく。 ``` (対象値 ÷ 全体値) × 100 ```

例えば、対象値が「14」、全体値が「73」の場合、「19.178082191780821917808219178082」となる。
およそ「19%」という解が求められる。

四捨五入

前述の例えのようにキリ良く割り切れない場合が多々ある。 「19.178082191780821917808219178082%」というパーセント表示は許容できないので丸める必要がある。

数値の小数点をばっさりどうにかしたい場合は、floorceilを使っても良い。
今回は柔軟に対応できるようにroundを使いたいと思う。

ちなみにroundは「数値の小数点以下を四捨五入」する関数である。

0% に注意する

対象値が「0」である場合、「0%」としたい。

ただ、この対象値をそのまま式に当てはめてしまうと

(0 / 73) * 100

以下のようなエラーが発生する。

Warning: Division by zero in ...

心情としては、0÷73=0 → 0*100=0 のように計算して欲しかった。

Division by zero とは

数値計算でゼロ除算をすると発生する例外である。 なので、計算前にif文などで対象値が「0」の場合は解を「0」とするか、ゼロ除算の例外をキャッチして対応する必要がある。

比率を返す関数

これらの背景を踏まえた上で以下のような関数を作成した。
function num2per($number, $total, $precision = 0) {
  if ($number < 0) {
    return 0;
  }

  try {
      $percent = ($number / $total) * 100;
      return round($percent, $precision);
    } catch (Exception $e) {
      return 0;
    }
  }
}

例外が発生した時は「0」を返すことにした。(前述のゼロ除算の例外を前提としているので何か他の例外に対応したい場合は個別に処理を追加する必要があると思うが、基本的にないと思われる)
また、第 3 引数で四捨五入する桁を指定していい感じの数値を返してもらうことにした。

使用例

num2per(14, 73, 0);
// 19

num2per(14, 73, 1);
// 19.2

num2per(14, 73, 2);
// 19.18

num2per(14, 73, 3);
// 19.178