2

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

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

阅读关于 SO 的其他问题,如果其中一个值等于 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我是否只显示“Up By 100%”?我的数学很差,我很困惑 - 请帮忙。

4

2 回答 2

4

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

  • 不要除以零!

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

于 2013-09-08T13:17:38.720 回答
0

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

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

于 2013-09-08T13:27:29.597 回答