18

是时候测试你的数学技能了……

我正在使用 php 查找 $num1、$num2、$num3 等的平均值;最多不定数量的数字。然后它将该平均值保存到数据库中。

下次调用 php 脚本时,会添加一个新号码。

是否有一个数学(很可能是代数)方程,我可以用它来找到包含新数字的原始数字的平均值。还是我需要将原始数字保存在数据库中,以便我可以查询它们并一起重新计算整个数字?

4

11 回答 11

65
array_sum($values) / count($values)
于 2010-11-16T19:32:15.750 回答
14

如果您所说的平均值是“平均值”并且您不想存储所有数字,则存储它们的计数:

$last_average = 100;
$total_numbers = 10;
$new_number = 54;

$new_average = (($last_average * $total_numbers) + $new_number) / ($total_numbers + 1);
于 2010-01-10T02:17:54.960 回答
12
Average = Sum / Number of values

只需存储所有 3 个值,不需要任何复杂的东西。

如果你存储Average然后Sum计算Number of values你会因为平均值的截断而失去一点准确性。

如果您存储Average然后Number of values计算Sum,您将失去更多的准确性。由于它是整数,因此在计算正确值时您有更多的错误余地Number of valuesSum

于 2010-01-10T02:20:09.090 回答
4
<?php
function avrg()
{
 $count = func_num_args();
 $args = func_get_args();
 return (array_sum($args) / $count);
}
?>

http://php.net/manual/en/function.array-sum.php#101727

于 2011-12-05T12:50:03.603 回答
3

认为我应该分享我的功能

function avg($sum=0,$count=0){
    return ($count)? $sum / $count: NAN;
}
var_dump( avg(array_sum($values),count($values)) );

将返回平均值并考虑 0,例如除以零总是返回 NaN(不是数字)

1/0 = NaN
0/0 = NaN

于 2013-08-02T14:22:58.927 回答
1

如果你知道数字的数量,你可以计算出旧的总和,加上新的数字,然后除以旧的数字加一。

$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
于 2010-01-10T02:19:27.413 回答
1

通常,您可能会保存两条信息:

  • 所有数字的总和
  • 数字的计数

每当您想获得平均值时,将总和除以计数(当然要注意计数 == 0 的情况)。每当您想包含一个新数字时,请将新数字添加到总和中并将计数加 1。

于 2010-01-10T02:20:41.603 回答
0

这称为“运行平均线”或“移动平均线”。

如果数据库存储平均值平均值的数量,则可以为每个新值计算新的运行平均值。

于 2010-01-10T02:21:34.540 回答
0
function avgvals($avg_vals,$avg_delimiter=',') { 
 if ( (is_string($avg_vals) && strlen($avg_vals) > 2) && (is_string($avg_delimiter) && !empty($avg_delimiter)) ) { 
    $average_vals = explode($avg_delimiter, $avg_vals); 
        $return_vals = ( array_sum($average_vals) / count($average_vals) ); 
 } elseif ( (is_string($avg_vals) && strlen($avg_vals) <= 2) && (is_string($avg_delimiter) && !empty($avg_delimiter)) ) { 
        $return_vals = $avg_vals; 
 } else { 
        $return_vals = FALSE; 
 } 
   return $return_vals; 
}
于 2011-10-26T14:34:54.067 回答
0

代码:

function avg($list){
    $sum = array_sum($list);
    $count = count($list);
  return ($count)? $sum / $count: NAN;
}
print ("Average: ".avg([1,2,3,4,5]));

输出:

Average: 3
于 2021-01-27T18:28:21.830 回答
-3

您需要将所有原始号码保存在数据库中。

于 2010-01-10T02:19:09.780 回答