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

您可以将所有结果作为数组传递并作为一个整体进行处理,而不是在函数中计算一个百分比。计算完所有百分比并四舍五入后,检查它们的总和是否为 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 次点击,所以:

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

然后对于每个除法,将结果四舍五入到“两位小数”,所以第一个结果:

0.09621.... becomes 0.10 

因为第 3 点是 5 或更高,如果第 3 点低于 5,它将保持在 0.09。

将所有结果四舍五入后,将每个结果乘以 100,然后将它们相加。最终结果将始终为 100。

但是应该警告您,根据您如何使用每个单独的百分比,当您四舍五入时,任何小于 0.05 的结果都将变为 0%,除非您在四舍五入之前保留该值,以便您可以将其声明为小于 1 的百分比。

于 2012-09-26T18:31:43.747 回答
0

我想你想使用ceil() or 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 回答