是时候测试你的数学技能了……
我正在使用 php 查找 $num1、$num2、$num3 等的平均值;最多不定数量的数字。然后它将该平均值保存到数据库中。
下次调用 php 脚本时,会添加一个新号码。
是否有一个数学(很可能是代数)方程,我可以用它来找到包含新数字的原始数字的平均值。还是我需要将原始数字保存在数据库中,以便我可以查询它们并一起重新计算整个数字?
array_sum($values) / count($values)
如果您所说的平均值是“平均值”并且您不想存储所有数字,则存储它们的计数:
$last_average = 100;
$total_numbers = 10;
$new_number = 54;
$new_average = (($last_average * $total_numbers) + $new_number) / ($total_numbers + 1);
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;
}
代码:
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
您需要将所有原始号码保存在数据库中。