计算增加百分比和减少百分比

时间:2014-11-25 19:49:12

标签: c# .net percentage

我可能会过度思考这个问题,但我正在寻找比现在更优雅的东西。

我有一个名为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,但我想知道是否有更好的方法。

我的问题:

如何才能正确计算负百分比,以及如何整体改进此代码?

3 个答案:

答案 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;
    }