我可能会过度思考这个问题,但我正在寻找比现在更优雅的东西。
我有一个名为CalculatePercentageTrend
的方法,它接收long
“前一个”值和“当前”值。目前的情况如下:
public static string CalculatePercentageTrend(long previousValue, long currentValue)
{
var trend = "0.00%";
// calculate percentage increase
if (previousValue < currentValue)
{
if (previousValue != 0)
{
var difference = previousValue - currentValue;
var pctDecrease = (double)(difference / previousValue) * 100;
trend = pctDecrease.ToString("P");
}
else
{
trend = currentValue.ToString("P");
}
}
// calculate percentage decrease
else if (currentValue < previousValue)
{
if (previousValue != 0)
{
var difference = currentValue - previousValue;
var pctIncrease = (double)(difference / previousValue) * 100;
trend = pctIncrease.ToString("P");
}
else
{
trend = currentValue.ToString("P");
}
}
return trend;
}
这感觉非常重复,并且有一些缺点。负趋势不能正确计算,因为它们总是导致0.00%的变化 - 如果我能得到负的百分比IF实际上前一个值大于当前值,那将是多么好。
另外,我在分割之前处理任何可能的0,但我想知道是否有更好的方法。
我的问题:
如何才能正确计算负百分比,以及如何整体改进此代码?
答案 0 :(得分:15)
你过度思考它。
double CalculateChange(long previous, long current)
{
if (previous == 0)
throw new InvalidOperationException();
var change = current - previous;
return (double)change / previous;
}
以友好的百分比形式向用户显示此数据&#39;格式,您可以使用:
string DoubleToPercentageString(double d)
{
return "%" + (Math.Round(d, 2) * 100).ToString();
}
答案 1 :(得分:2)
我认为这样可以解决您的问题,您只需计算相对于之前价值的差异及其比率。
public static string CalculatePercentageTrend(long previous, long current)
{
return ((current - previous) / (double)previous).ToString("p");
}
答案 2 :(得分:1)
我使用了100%准确度的跟随功能。
decimal CalculateChange(decimal previous, decimal current)
{
if (previous == 0)
return 0;
if (current == 0)
return -100;
var change = ((current - previous) / previous) * 100;
return change;
}