在你开始嘲笑这么简单的问题之前,让我解释一下:
我正在尝试确定帐户中各种指标的变化(百分比%)。这并不是特别难。但是,您通常如何处理当前值为零或先前值为零的情况?
即
本周:收益= $ 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,
答案 0 :(得分:8)
变化可以是积极的,也可以是消极的。所以公式是:
var change = ((V2 - V1) / Math.Abs(V1)) * 100;
示例:
[((V2-V1)/ | V1 |)* 100]
=((220 - 110)/ | 110 |)* 100 =(110/110)* 100 = 1 * 100 = 100%变化
= 100%增加
[((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(所有其他情况),但人类不会喜欢任何一个答案。如果我不能从用户那里找到最适合做的事情,我会展示类似的东西。