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%的回报。这正是我需要的!工作起来很有魅力!