是时候测试您的数学技能...

我正在使用PHP查找$ num1,$ num2,$ num3等的平均值;达到数量的数量。然后,它将该平均值保存到数据库中。

下次,PHP脚本称为新号码时,将添加到混音中。

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

有帮助吗?

解决方案

如果您的平均意思是意思是,而您不想存储所有数字,请存储数量的数量:

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

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

其他提示

array_sum($values) / count($values)
Average = Sum / Number of values

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

如果您存储 AverageSum 然后计算 Number of values 由于平均值的截断,您将失去一点精度。

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

<?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

以为我应该分享我的功能

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

如果您知道可以计算旧金的数量数量,请添加新的总和,然后除以旧金额加一个。

$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);

通常,您可能要做的就是保存两个信息:

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

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

这称为“跑步平均”或“移动平均值'.

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top