题
是时候测试您的数学技能...
我正在使用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个值,就不需要任何复杂的东西。
如果您存储 Average
和 Sum
然后计算 Number of values
由于平均值的截断,您将失去一点精度。
如果您存储 Average
和 Number of values
然后计算 Sum
您将失去更准确性。在计算正确值时,您有更多的错误 Number of values
比 Sum
由于它是一个整数。
<?php
function avrg()
{
$count = func_num_args();
$args = func_get_args();
return (array_sum($args) / $count);
}
?>
以为我应该分享我的功能
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;
}
您需要将所有原始数字保存在数据库中。
不隶属于 StackOverflow