用php计算平均数
Posted
技术标签:
【中文标题】用php计算平均数【英文标题】:Math average with php 【发布时间】:2011-01-03 09:29:38 【问题描述】:是时候测试你的数学技能了...
我在用php求$num1、$num2、$num3等的平均值;最多不定数量的数字。然后它将平均值保存到数据库中。
下次调用 php 脚本时,会添加一个新号码。
是否有一个数学(很可能是代数)方程,我可以使用它来找到包含新数字的原始数字的平均值。还是我需要将原始数字保存在数据库中,以便我可以查询它们并重新计算整个数字?
【问题讨论】:
【参考方案1】:array_sum($values) / count($values)
【讨论】:
我怎么没想到这个哈哈 $values 为空时除以零 $avg = 0; if(count($values)) $avg = array_sum($values) / count($values); 【参考方案2】:如果您所说的平均值是“平均值”,并且您不想存储所有数字,则存储它们的计数:
$last_average = 100;
$total_numbers = 10;
$new_number = 54;
$new_average = (($last_average * $total_numbers) + $new_number) / ($total_numbers + 1);
【讨论】:
$total_numbers
可能不可用。
$total_numbers 是指定问题的必需实现细节。要么实现它,要么问题无法解决。
这将导致越来越多的准确性损失。使用 $last_total 而不是 $last_average。请参阅 Mike 的回答。
啊,真的,没想到。最好也保留 $last_sum。【参考方案3】:
Average = Sum / Number of values
只需存储所有 3 个值,不需要任何复杂的东西。
如果您存储Average
和Sum
然后计算Number of values
,由于平均值的截断,您会损失一点准确性。
如果您存储 Average
和 Number of values
然后计算 Sum
您将失去更多的准确性。由于 Number of values
是一个整数,您在计算 Number of values
的正确值时比 Sum
有更大的误差余地。
【讨论】:
你不需要存储平均值,你可以在不损失任何精度的情况下计算它。【参考方案4】:<?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
【讨论】:
【参考方案5】:认为我应该分享我的功能
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
【讨论】:
【参考方案6】:如果您知道可以计算旧总和的数字数量,请将新数字相加,然后除以旧数字加一。
$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
【讨论】:
@slebetman - 但这与您接受的答案相同。 啊.. 抱歉,我看错了代码。我收回我之前的评论。【参考方案7】:通常您可能会保存两条信息:
所有数字的总和 数字计数当您想获得平均值时,将总和除以计数(当然要注意计数 == 0 的情况)。每当您想包含一个新数字时,请将新数字添加到总和中并将计数加 1。
【讨论】:
【参考方案8】:这称为“运行平均值”或“moving average”。
如果数据库存储平均值和平均值的数量,则可以为每个新值计算新的运行平均值。
【讨论】:
【参考方案9】: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;
【讨论】:
【参考方案10】:代码:
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
【讨论】:
【参考方案11】:您需要将所有原始号码保存在数据库中。
【讨论】:
以上是关于用php计算平均数的主要内容,如果未能解决你的问题,请参考以下文章