C# NET内核中的Excel速率函数
我尝试在.NET核心项目中使用RATE函数。 我想使用一个Visual Basic库,但它不适用于.NET CORE。C# NET内核中的Excel速率函数,c#,excel,.net-core,C#,Excel,.net Core,我尝试在.NET核心项目中使用RATE函数。 我想使用一个Visual Basic库,但它不适用于.NET CORE。 有没有其他方法可以使用它,或者我应该显式地计算它?怎么用?我找不到这个函数的任何解释 根据@omajid注释,我将官方VB代码转换为C。 这就是使用Rate方法而不依赖Microsoft.VisualBasic.dll所需的全部内容,Microsoft.VisualBasic.dll在.NET CORE中缺少此方法 private double Rate(double NPe
有没有其他方法可以使用它,或者我应该显式地计算它?怎么用?我找不到这个函数的任何解释 根据@omajid注释,我将官方VB代码转换为C。 这就是使用Rate方法而不依赖Microsoft.VisualBasic.dll所需的全部内容,Microsoft.VisualBasic.dll在.NET CORE中缺少此方法
private double Rate(double NPer, double Pmt, double PV, double FV = 0, DueDate Due = DueDate.EndOfPeriod, double Guess = 0.1)
{
double dTemp;
double dRate0;
double dRate1;
double dY0;
double dY1;
int I;
// Check for error condition
if (NPer <= 0.0)
throw new ArgumentException("NPer must by greater than zero");
dRate0 = Guess;
dY0 = LEvalRate(dRate0, NPer, Pmt, PV, FV, Due);
if (dY0 > 0)
dRate1 = (dRate0 / 2);
else
dRate1 = (dRate0 * 2);
dY1 = LEvalRate(dRate1, NPer, Pmt, PV, FV, Due);
for (I = 0; I <= 39; I++)
{
if (dY1 == dY0)
{
if (dRate1 > dRate0)
dRate0 = dRate0 - cnL_IT_STEP;
else
dRate0 = dRate0 - cnL_IT_STEP * (-1);
dY0 = LEvalRate(dRate0, NPer, Pmt, PV, FV, Due);
if (dY1 == dY0)
throw new ArgumentException("Divide by zero");
}
dRate0 = dRate1 - (dRate1 - dRate0) * dY1 / (dY1 - dY0);
// Secant method of generating next approximation
dY0 = LEvalRate(dRate0, NPer, Pmt, PV, FV, Due);
if (Math.Abs(dY0) < cnL_IT_EPSILON)
return dRate0;
dTemp = dY0;
dY0 = dY1;
dY1 = dTemp;
dTemp = dRate0;
dRate0 = dRate1;
dRate1 = dTemp;
}
throw new ArgumentException("Can not calculate rate");
}
private double LEvalRate(double Rate, double NPer, double Pmt, double PV, double dFv, DueDate Due)
{
double dTemp1;
double dTemp2;
double dTemp3;
if (Rate == 0.0)
return (PV + Pmt * NPer + dFv);
else
{
dTemp3 = Rate + 1.0;
// WARSI Using the exponent operator for pow(..) in C code of LEvalRate. Still got
// to make sure that they (pow and ^) are same for all conditions
dTemp1 = Math.Pow(dTemp3, NPer);
if (Due != 0)
dTemp2 = 1 + Rate;
else
dTemp2 = 1.0;
return (PV * dTemp1 + Pmt * dTemp2 * (dTemp1 - 1) / Rate + dFv);
}
}
private const double cnL_IT_STEP = 0.00001;
private const double cnL_IT_EPSILON = 0.0000001;
enum DueDate
{
EndOfPeriod = 0,
BegOfPeriod = 1
}
私人双费率(双NPer、双Pmt、双PV、双FV=0,到期日=DueDate.EndOfPeriod,双猜测=0.1)
{
双dTemp;
双德拉特0;
双德拉特1;
双dY0;
双dY1;
int I;
//检查错误条件
如果(NPer 0)
dRate1=(dRate0/2);
其他的
dRate1=(dRate0*2);
dY1=左旋乳酸(dRate1、NPer、Pmt、PV、FV、到期);
对于(I=0;I dRate0)
dRate0=dRate0-cnL_IT_步骤;
其他的
dRate0=dRate0-cnL_IT_步骤*(-1);
dY0=左旋乳酸(dRate0、NPer、Pmt、PV、FV、到期);
如果(dY1==dY0)
抛出新的ArgumentException(“除以零”);
}
dRate0=dRate1-(dRate1-dRate0)*dY1/(dY1-dY0);
//生成下一近似的割线法
dY0=左旋乳酸(dRate0、NPer、Pmt、PV、FV、到期);
if(数学绝对值(dY0)
您可以使用诸如ILSpy之类的工具查看Microsoft.VisualBasic.dll中Rate函数的源代码反转源代码,然后使用它可能具有法律风险。幸运的是,Microsoft在MIT许可下提供了Rate的源代码: