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

X30*_*61X 4 .net c# percentage

我可能过度思考了这一点,但我正在寻找比现在更优雅的东西.

我调用了这个方法CalculatePercentageTrend,它接受long"previous"值和"current"值.目前的情况如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

这感觉非常重复,并且有一些缺点.负趋势不能正确计算,因为它们总是导致0.00%的变化 - 如果我能得到负的百分比IF实际上前一个值大于当前值,那将是多么好.

另外,我在分割之前处理任何可能的0,但我想知道是否有更好的方法.

我的问题 :

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

Mic*_*ael 16

你是在想它.

double CalculateChange(long previous, long current)
{
    if (previous == 0)
        throw new InvalidOperationException();

    var change = current - previous;
    return (double)change / previous;
}
Run Code Online (Sandbox Code Playgroud)

要以友好的"百分比"格式向用户显示此数据,您可以使用:

string DoubleToPercentageString(double d)
{
    return "%" + (Math.Round(d, 2) * 100).ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 我从未见过程序返回一个百分比的整数。它始终是一个小数,其中 1 代表 100。我知道这些评论已经过时了,但我有点惊讶任何人都希望将百分比返回为 50 而不是 0.50。 (2认同)

Sik*_*mla 6

我使用以下函数,准确率 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;
    }
Run Code Online (Sandbox Code Playgroud)