测试你的数学技能时间到了...
我正在使用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);
$total_numbers
可能不可用。 - Alix AxelAverage = Sum / Number of values
只需存储所有3个值,没有必要进行复杂的操作。
如果存储平均数
和总和
,然后计算值的数量
,由于对平均值的截断而失去一点精度。
如果存储平均数
和值的数量
,然后计算总和
,将失去更多精度。计算值的数量
的正确值比计算总和
有更大的误差余地,这要归功于它是一个整数。
<?php
function avrg()
{
$count = func_num_args();
$args = func_get_args();
return (array_sum($args) / $count);
}
?>
我觉得应该分享一下我的函数
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
$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
通常你需要保存两个信息:
每当你想要计算平均值时,将总和除以数量(当然要注意数量等于0的情况)。每当你想要添加一个新数字时,将新数字加到总和中,并将数量增加1。
代码:
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
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;
}