用PHP计算数学平均值

22

测试你的数学技能时间到了...

我正在使用php来计算$num1、$num2、$num3等未设置数量的数字的平均值。接着,将该平均值保存到数据库中。

下一次调用php脚本时,新的数字将被添加到计算中。

是否有一种数学(很可能是代数)方程可以用来找出原始数字与新数字合并后的平均值?还是我需要将原始数字保存在数据库中,以便在需要时查询它们并重新计算所有数字的平均值?

11个回答

76
array_sum($values) / count($values)

为什么我没想到这个哈哈 - Adam Fowler
当$values为空时,除以零。 - Pascal_dher
$avg = 0; 如果(count($values)){ $avg = array_sum($values) / count($values); } - Anurag Prashant

16

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

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

$new_average = (($last_average * $total_numbers) + $new_number) / ($total_numbers + 1);

$total_numbers 可能不可用。 - Alix Axel
8
$total_numbers是指定问题的一个必要实现细节。如果不实现它,那么问题将无法解决。 - slebetman
10
这将导致准确性不断降低。使用$last_total而不是$last_average。请参考Mike的回答。 - GZipp
啊,没想到那个。最好也保留$last_sum。 - slebetman

13
Average = Sum / Number of values

只需存储所有3个值,没有必要进行复杂的操作。

如果存储平均数总和,然后计算值的数量,由于对平均值的截断而失去一点精度。

如果存储平均数值的数量,然后计算总和,将失去更多精度。计算值的数量的正确值比计算总和有更大的误差余地,这要归功于它是一个整数。


你不需要存储平均值,可以在不损失精度的情况下计算它。 - starblue

5

4

我觉得应该分享一下我的函数

function avg(array $values) {
    $sum = array_sum($values);
    $count = count($values);
    return ($count !== 0)? $sum / $count: NAN;
}
echo avg([1, 2, 3, 4]); // 2.5

将返回平均值,并考虑0,例如除以零始终返回NaN(非数字)

1/0 = NaN
0/0 = NaN


1
如果您知道可以计算的数量,您可以计算旧总和,加上新的总和并除以旧数量加一。
$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);

@slebetman - 但这与您接受的答案相同。 - GZipp
啊...对不起,我看错了代码。撤回我之前的评论。 - slebetman

1

通常你需要保存两个信息:

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

每当你想要计算平均值时,将总和除以数量(当然要注意数量等于0的情况)。每当你想要添加一个新数字时,将新数字加到总和中,并将数量增加1。


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

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; 
}

0

这被称为“滑动平均”或“移动平均”。

如果数据库存储了平均值平均值的数量,那么就可以为每个新值计算一个新的滑动平均值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接