関数化して柔軟に対応する必要があったのでメモ。
比率の計算方法
算数の問題であるが重要な部分なので記述しておく。 ``` (対象値 ÷ 全体値) × 100 ```例えば、対象値が「14」、全体値が「73」の場合、「19.178082191780821917808219178082」となる。
およそ「19%」という解が求められる。
関数化して柔軟に対応する必要があったのでメモ。
例えば、対象値が「14」、全体値が「73」の場合、「19.178082191780821917808219178082」となる。
およそ「19%」という解が求められる。
数値の小数点をばっさりどうにかしたい場合は、floor
やceil
を使っても良い。
今回は柔軟に対応できるようにround
を使いたいと思う。
ちなみにround
は「数値の小数点以下を四捨五入」する関数である。
ただ、この対象値をそのまま式に当てはめてしまうと
(0 / 73) * 100
以下のようなエラーが発生する。
Warning: Division by zero in ...
心情としては、0÷73=0 → 0*100=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