Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET内核中的Excel速率函数_C#_Excel_.net Core - Fatal编程技术网

C# NET内核中的Excel速率函数

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

我尝试在.NET核心项目中使用RATE函数。 我想使用一个Visual Basic库,但它不适用于.NET CORE。


有没有其他方法可以使用它,或者我应该显式地计算它?怎么用?我找不到这个函数的任何解释

根据@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的源代码: