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

时间:2009-09-03 23:33:41

标签: c# linq-to-sql

在你开始嘲笑这么简单的问题之前,让我解释一下:

我正在尝试确定帐户中各种指标的变化(百分比%)。这并不是特别难。但是,您通常如何处理当前值为零或先前值为零的情况?

本周:收益= $ 25.6

上周:收入= $ 0.0

我目前通过以下公式计算%差异:

If (CurrentValue > 0.0 && PreviousValue > 0.0) {
   return (CurrentValue - PreviousValue) / PreviousValue;
}  return 0.0;

如果前一周的收益为零 - %差异应该是多少?的 +无穷
反之,如果当前周为零?的 -Infinity

然后复杂的事情是如何在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 个答案:

答案 0 :(得分:8)

变化可以是积极的,也可以是消极的。所以公式是:

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

示例:

  1. 计算从V1 = 110到V2 = 220(正变化)的百分比变化
  2. [((V2-V1)/ | V1 |)* 100]

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

    = 100%增加

    1. 计算从V1 = 150到V2 = 75(负变化)的百分比变化
    2. [((V2-V1)/ | V1 |)* 100]

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

      =减少50%

      注意:这不会处理零。你可以自己做那个

答案 1 :(得分:5)

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

如果没有其他选择,我宁愿不可用。

100%可能有意义。

也许使用1而不是0也可能有意义,导致你的例子中有2560%。

答案 2 :(得分:3)

您可以随意将%更改设置为X,其中X是问题空间的合理默认值。然而,这不是一个编程问题。这是你期望的问题。当任何数字接近零时应该发生什么是问题空间的函数。例如,我曾在会计“功能”上工作过一次。这个函数没什么特别的,它只是将一个评分方法转换为代码。问题在于评分方法,并且没有人定义默认值是什么,因为一些分母变为零。对于任何给定的会计分数,在零处发生的事件可能是满分,部分分数或0分(在分级等级上),具体取决于所测量的细节。

确定您正在测量的内容并将合理的默认值替换为零。如果你正在测量性能,请确保有人不能通过故意花费0美元,然后是高美元周(例如)来游戏系统。

答案 3 :(得分:1)

我记得我的导师称它为'未定义'而不是无限。

来自wikipedia

  

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

虽然技术上答案是未定义的(在$ 0 / $ 0情况下)或infinity / -infinity(所有其他情况),但人类不会喜欢任何一个答案。如果我不能从用户那里找到最适合做的事情,我会展示类似的东西。