4

ページ上の10個のリンクのクリック数を合計してから、それぞれをクリックした人の割合を計算する必要があります。これは簡単な除算ですが、最後に100%のラウンドを確実に取得するにはどうすればよいですか。

以下のコードを使用したいのですが、この関数はピリオドの後に数値を削除するだけなので、パーセンテージが100%に達しない状況が発生する可能性があるのではないかと心配しています。

function percent($num_amount, $num_total) {
$count1 = $num_amount / $num_total;
$count2 = $count1 * 100;
$count = number_format($count2, 0);
echo $count;
}

何かアドバイスをいただければ幸いです。

4

4 に答える 4

5

関数で1パーセントを計算する代わりに、すべての結果を配列として渡し、全体として処理することができます。すべてのパーセンテージを計算して丸めた後、合計が100かどうかを確認します。そうでない場合は、最大値を調整して、すべてを合計100にします。最大値を調整すると、結果の偏りができるだけ少なくなります。

私の例の配列は、調整を行う前に合計100.02になります。

function percent(array $numbers)
{
    $result = array();
    $total = array_sum($numbers);

    foreach($numbers as $key => $number){
        $result[$key] = round(($number/$total) * 100, 2);
    }

    $sum = array_sum($result);//This is 100.02 with my example array.

    if(100 !== $sum){
        $maxKeys = array_keys($result, max($result));
        $result[$maxKeys[0]] = 100 - ($sum - max($result));
    }
    return $result;
}


$numbers = array(10.2, 22.36, 50.10, 27.9, 95.67, 3.71, 9.733, 4.6, 33.33, 33.33);
$percentages = percent($numbers);
var_dump($percentages);
var_dump(array_sum($percentages));

出力:-

array (size=10)
  0 => float 3.51
  1 => float 7.69
  2 => float 17.22
  3 => float 9.59
  4 => float 32.86
  5 => float 1.28
  6 => float 3.35
  7 => float 1.58
  8 => float 11.46
  9 => float 11.46
float 100

これは、関数パラメーターとして連想配列でも機能します。キーは保持されます。

これらの数値は、表、グラフ、またはチャートで表示できるようになり、常に合計100%になります。

于 2012-09-26T19:35:57.787 に答える
3

あなたがしたいのはこれです。

全体的なクリック数を合計し、各数を合計で割ります。例えば:

1134
5391
2374
2887

この場合、合計11786回のクリックで4つのボタンがあるため、次のようになります。

1134 / 11786 = 0.09621....
5391 / 11786 = 0.45740....
2374 / 11786 = 0.20142....
2887 / 11786 = 0.24495....

次に、除算ごとに、結果を「小数点以下2桁」に丸めて、最初の結果を次のようにします。

0.09621.... becomes 0.10 

3番目のポイントは5以上であるため、3番目のポイントが5未満の場合、0.09のままになります。

すべての結果を四捨五入したら、それぞれに100を掛けて、合計します。最終結果は常に100になります。

ただし、個々のパーセンテージの使用方法によっては、丸めるときに、0.05未満の結果は、丸める前に値を保持して1未満のパーセンテージとして宣言できない限り、0%になることに注意してください。

于 2012-09-26T18:31:43.747 に答える
0

使いたいと思いceil() ますround()

これらは浮動小数点数であるため、エラーの余地があります。丸め方に注意し、最後の残りのパーセンテージを個別に計算しないようにしてください。あなたが持っているものの合計を1または100から引くだけです。

方程式の別々の辺を計算しないように注意してください。一方の辺を合計してから、もう一方の辺を1または100から減算してください。そうしないと、パーセンテージを処理します。

于 2012-09-26T17:59:10.530 に答える
0

私はこれにかなり遭遇し、それをハックします。


$percentages = array(
    '1'         => 87.5,
    '2'         => 12.5,
    '3'         => 0,
    '4'         => 0,
    '5'         => 0
);

これらのパーセンテージを出力に丸めると、88%と13%(101%)になります。

round($percentages['1']);
round($percentages['2']);

// 88
// 13

これが私がそれを修正するために使用するコードです。

$checkTotal     = array_sum($percentages);
$max            = max(array_keys($percentages));

if ($checkTotal > 100) {
    $percentages[$max] = $percentages[$max] - 1;
}
if ($checkTotal < 100) {
    $percentages[$max] = $percentages[$max] + 1;
}

100の場合は、何もしません。

100未満の場合は、1を加算して100に等しくします。

100を超える場合は、1を引いて100になります。

于 2019-10-29T12:25:19.933 に答える