计算增加和减少百分比

本文关键字:百分比 增加 计算 | 更新日期: 2023-09-27 18:32:01

我可能想多了,但我正在寻找比我目前拥有的更优雅的东西。

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

我的问题 :

如何获得负百分比以正确计算,以及如何从整体上改进此代码?

计算增加和减少百分比

你想得太多了。

double CalculateChange(long previous, long current)
{
    if (previous == 0)
        throw new InvalidOperationException();
    var change = current - previous;
    return (double)change / previous;
}

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

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

我以 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;
    }

我认为这将解决您的问题,您所需要的只是计算差异及其与先前值的比率。

public static string CalculatePercentageTrend(long previous, long current)
{
    return ((current - previous) / (double)previous).ToString("p");
}