计算两个值之间的百分比差异

8
在你开始嘲笑这样一个简单的问题之前,让我来解释一下:
我正试图确定账户在各种指标下的变化百分比。这并不是特别困难。但是,当当前值为零或上一个值为零时,通常如何处理这些情况?
例如:
本周:收益= $25.6
上周:收益= $0.0
我目前通过以下公式计算%差异:
If (CurrentValue > 0.0 && PreviousValue > 0.0) {
   return (CurrentValue - PreviousValue) / PreviousValue;
}  return 0.0;

如果上一周的收入为零-百分比差是什么?+无穷大? 相反,如果当前周为零呢?-无穷大
然后,为了使事情变得更加复杂,您将如何在Linq-To-SQL查询中处理此问题?
Upside_Earnings = (statistics.Where(d => d.DateTime > first_startdate && d.DateTime <= first_enddate).Average(e => (double)e.Earnings) > zero &&
                                     statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings) > zero) ?
                                   ((statistics.Where(d => d.DateTime > first_startdate && d.DateTime <= first_enddate).Average(e => (double)e.Earnings) -
                                     statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings)) /
                                     statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings)) : zero,
6个回答

20

变化可以是积极的或消极的。因此,公式如下:

var change = ((V2 - V1) / Math.Abs(V1)) * 100;

示例:

  1. 计算从V1 = 110到V2 = 220的百分比变化(正变化)

[ ((V2 - V1) / |V1|) * 100 ]

= ((220 - 110) / |110|) * 100 = (110 / 110) * 100 = 1 * 100 = 100% 变化

= 增加100%

  1. 计算从V1 = 150到V2 = 75的百分比变化(负变化)

[ ((V2 - V1) / |V1|) * 100 ]

= ((75 - 150) / |150|) * 100 = (-75 / 150) * 100 = -0.5 * 100 = -50% 变化

= 减少50%

注意:此方法不处理零值。您可以自己处理。


5

在这种情况下该怎么做是主观的,很可能取决于您的业务需求。

如果没有其他选择,我会选择“不可用”。

100%可能是有道理的。

也许在您的例子中使用1而不是零也可能是有道理的,从而得到2560%。


好主意。2560%可能对用户更有意义。它使得各种零的情况可以自行排序。 - Andrew Harry

3
您可以任意将变化率设为X,其中X是您问题空间的合理默认值。然而,这不是一个编程问题,而是一个期望值的问题。当任何数字接近零时会发生什么是问题空间的函数。例如,我曾经在一个会计“函数”上工作过。该函数并不特别,它只是将评分方法转换为代码。问题在于评分方法以及没有人定义某些分母为零时的默认值。对于任何给定的会计分数,在零处发生的可能是满分、部分分或0分(在分级标准上),具体取决于所测量的细节。
确定您要测量的内容,并将零的合理默认值替换为其他值。如果您正在测量性能,请确保没有人可以通过有意地让$0周后跟随高额周来操纵系统(例如)。

好的一点是,在我的情况下,统计数据不太可能受到任何篡改的影响。 - Andrew Harry

1

我记得我的讲师称之为“未定义”,而不是无穷大。

来自wikipedia

任何数除以零(除数为零)都是未定义的。这是因为无论这个方程重复多少次,零加上零总是得到零。在大多数计算器中输入这样的方程会导致出现错误消息。


当两个值都为零时,我很乐意将它们的差称为零。问题在于其中一个值为零的情况。 - Andrew Harry
是的,我很确定它是未定义的,x/0不是无穷大。 - Davis
为了排序目的,我认为负无穷和正无穷更直观。 - Andrew Harry

1
我会存储 NaN 或无穷大,或任何有意义的值,但在显示给用户时,我会将百分比留空或以某种方式指示百分比无意义。

是的,看起来这才是我的问题所在 - 它涉及到期望。当用户按百分比差异排序列表时,他们期望什么?无穷大是否有意义?还是应该将其减少到零? - Andrew Harry

0

尽管从技术上讲,在$0/$0的情况下答案可以是未定义的,而在所有其他情况下都可能是无穷大/-无穷大,但人类并不会喜欢任何一种答案。如果我无法从用户那里找到最好的解决方案,我会显示类似 或其他类似的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接