警告:除以零 - 计算百分比

时间:2013-09-08 13:13:52

标签: php

好的,在我开始之前,我想指出我知道除以零并不好。我想知道的是,避免这种情况的最佳方法是什么。

在我的CMS中,我正在尝试显示最近注册的注册用户数量。我显示的第一个统计信息是“今日注册用户”,并显示此值是从昨天的值上升还是下降,并将其显示为正/负百分比。

在这里阅读其他问题,如果其中一个值等于0,人们建议完全避免计算,但是如果昨天有0个注册用户,今天有20个,那么我需要显示一个明确的增长 - 我不能只显示任何东西。

我创建了这个查询:

SELECT
COUNT(CASE WHEN DATEDIFF(HOUR, CURDATE(), created) <= 24 THEN user_id
ELSE NULL END) AS 1day,
COUNT(CASE WHEN DATEDIFF(HOUR, CURDATE(), created) >= 25 AND DATEDIFF(HOUR, CURDATE(), created) <= 48 THEN user_id
ELSE NULL END) AS 1to2days,
... other cases ...
FROM users

此功能:

function diff_percent($a, $b) {
    $c = ($a > $b) ? ($a-$b)/$a*-100 : ($b-$a)/$b*100; 
    return $c;
}

简单地称之为:

echo diff_percent($row['1to2days'], $row['1day']);

我可以很容易地使用SQL将零转换为null,或者如果检测到零,我可以在函数中停止计算,但正如我上面提到的,如果昨天有0个用户,今天有20个,我必须表明在过去24小时内用户数量大幅增加。解决这个问题的最佳方法是什么?如果todays_users > yesterdays_usersyesterdays_users == 0我只是显示'上升100%'?我的数学很差,我很困惑 - 请帮忙。

2 个答案:

答案 0 :(得分:3)

“好的,在我开始之前,我想指出我知道除以零是不好的。我想知道的是,避免这种情况的最佳方法是什么。”

  • 不要除以零!

在进行计算之前添加额外的检查,如果遇到零则处理该适当的。即显示不同的消息而不是百分比。

答案 1 :(得分:0)

为什么不尝试使用中点方法(http://www.econport.org/content/handbook/Elasticity/Calculating-Percentage-Change.html)来查找百分比,无论是在所有情况下还是在初始值为0时?基本上,不是将变化除以初始值(如正常百分比),而是将变化除以初始值和最终值的平均值。

如果你使用中点方法,如果两个值都为零(假设我们没有处理负数)你将只能得到零除错误,你可以将其视为特殊情况,只显示0%,因为没有变化。