C# 计算增加和减少的百分比

C# 计算增加和减少的百分比,c#,.net,percentage,C#,.net,Percentage,我可能想得太多了,但我正在寻找比我现在拥有的更优雅的东西 我有一个名为CalculatePercentageTrend的方法,它接受一个长的“先前”值和“当前”值。目前的情况是: public static string CalculatePercentageTrend(long previousValue, long currentValue) { var trend = "0.00%"; // calculate percentage increase if (pr

我可能想得太多了,但我正在寻找比我现在拥有的更优雅的东西

我有一个名为
CalculatePercentageTrend
的方法,它接受一个
长的
“先前”值和“当前”值。目前的情况是:

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;
}
public静态字符串CalculatePercentageTrend(long previousValue,long currentValue)
{
var趋势=“0.00%”;
//计算增长百分比
如果(以前的值<当前值)
{
如果(以前的值!=0)
{
var差异=以前的值-当前值;
var pctDecrease=(双)(差值/先前值)*100;
趋势=PCT减少到字符串(“P”);
}
其他的
{
趋势=当前值。ToString(“P”);
}
}
//计算减少百分比
else if(当前值<先前值)
{
如果(以前的值!=0)
{
var差异=当前值-以前的值;
var pctIncrease=(双精度)(差值/先前值)*100;
趋势=pct增加到字符串(“P”);
}
其他的
{
趋势=当前值。ToString(“P”);
}
}
回归趋势;
}
这感觉非常重复,并且有一些缺点。负趋势的计算不正确,因为它们总是导致0.00%的变化-如果我可以得到负百分比,如果事实上前一个值大于当前值,那就更好了

此外,我在分割之前处理任何可能的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();
}

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

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

我使用了以下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;
    }

你需要摆脱你的第一个if,否则if。只需检查其中一个变量是否为0。然后执行(上一个-当前)/上一个*100。如果是增加,则返回正值;如果是减少,则返回负值。至少,将
(双精度)(差异/先前值)*100
更改为
((双精度)差异/先前值)*100重要的是要理解,如果您打算以任何方式使用该结果,而不是向用户显示更“友好”的值,则不应将该结果乘以100。31% == .31, 31% != 3131==3100%。您需要将结果乘以100,才能将数字作为百分比,这严格来说是一个显示问题。如果你将这个结果乘以100,然后尝试用它来操作任何东西,你将不会得到想要的结果。50%=.5是的,但他的方法表明答案将以百分比而不是小数返回。同样,50%等于.5,而不是50。我从未见过程序以百分比返回整数。它总是一个小数点,1代表100。我知道这些评论都是过时的,但我有点震惊,任何人都会期望以50%而不是.50%的回报。这正是我需要的!工作起来很有魅力!