【问题标题】:How do I access a function in an object of functions?如何访问函数对象中的函数?
【发布时间】:2020-07-31 18:43:58
【问题描述】:

目前,我已将 github 中的这段代码添加到我的代码中:

var ExcelFormulas = {

    PVIF: function(rate, nper) {
        return Math.pow(1 + rate, nper);
    },

    FVIFA: function(rate, nper) {
        return rate == 0? nper: (this.PVIF(rate, nper) - 1) / rate;
    },  

    PMT: function(rate, nper, pv, fv, type) {
        if (!fv) fv = 0;
        if (!type) type = 0;

        if (rate == 0) return -(pv + fv)/nper;
        
        var pvif = Math.pow(1 + rate, nper);
        var pmt = rate / (pvif - 1) * -(pv * pvif + fv);

        if (type == 1) {
            pmt /= (1 + rate);
        };

        return pmt;
    },

    IPMT: function(pv, pmt, rate, per) {
        var tmp = Math.pow(1 + rate, per);
        return 0 - (pv * tmp * rate + pmt * (tmp - 1));
    },

    PPMT: function(rate, per, nper, pv, fv, type) {
        if (per < 1 || (per >= nper + 1)) return null;
        var pmt = this.PMT(rate, nper, pv, fv, type);
        var ipmt = this.IPMT(pv, pmt, rate, per - 1);
        return pmt - ipmt;
    },
    
    DaysBetween: function(date1, date2) {
        var oneDay = 24*60*60*1000;
        return Math.round(Math.abs((date1.getTime() - date2.getTime())/oneDay));
    },
    
    // Change Date and Flow to date and value fields you use
    XNPV: function(rate, values) {
        var xnpv = 0.0;
        var firstDate = new Date(values[0].Date);
        for (var key in values) {
            var tmp = values[key];
            var value = tmp.Flow;
            var date = new Date(tmp.Date);
            xnpv += value / Math.pow(1 + rate, this.DaysBetween(firstDate, date)/365);
        };
        return xnpv;
    },

    XIRR: function(values, guess) {
        if (!guess) guess = 0.1;
        
        var x1 = 0.0;
        var x2 = guess;
        var f1 = this.XNPV(x1, values);
        var f2 = this.XNPV(x2, values);
        
        for (var i = 0; i < 100; i++) {
            if ((f1 * f2) < 0.0) break;
            if (Math.abs(f1) < Math.abs(f2)) {
                f1 = this.XNPV(x1 += 1.6 * (x1 - x2), values);
            }
            else {
                f2 = this.XNPV(x2 += 1.6 * (x2 - x1), values);
            }
        };
        
        if ((f1 * f2) > 0.0) return null;
        
        var f = this.XNPV(x1, values);
        if (f < 0.0) {
            var rtb = x1;
            var dx = x2 - x1;
        }
        else {
            var rtb = x2;
            var dx = x1 - x2;
        };
        
        for (var i = 0; i < 100; i++) {
            dx *= 0.5;
            var x_mid = rtb + dx;
            var f_mid = this.XNPV(x_mid, values);
            if (f_mid <= 0.0) rtb = x_mid;
            if ((Math.abs(f_mid) < 1.0e-6) || (Math.abs(dx) < 1.0e-6)) return x_mid;
        };
        
        return null;
    }

};

我正在尝试在此数组中使用 PPMT 函数。这是我找到的有关如何访问 XIRR 功能的示例:

var values =
[
{Date:'1/24/2012',Flow: -10000},
{Date:'6/27/2015',Flow: 12000}
];
alert(ExcelFormulas.XIRR(values));

但是当我尝试用 PPMT 做类似的事情时,我得到了 null。这就是我正在尝试的:

var values =
[
{rate:0.53, per: 1, nper : 12, pv:10000}
];
alert(ExcelFormulas.XIRR(values));

谁能帮我访问 PPMT 功能?提前谢谢!

(旁注:你可以输入任何值,只要它有效,我只需要一个例子)

【问题讨论】:

  • 你知道如何调用函数吗?
  • 函数被正确调用,所以这一定是关于该函数中的逻辑
  • 首先,您仍然调用XIRR 而不是PPMT。其次,PPMT 似乎要求 6(!) 个值,而不是对象,而不是数组 - 在你的 values 中你只有 4 个(缺少 type) - 你应该这样称呼它:alert(ExcelFormulas.PPMT(rate, per, nper, pv, fv, type)); - 要么给出这些值:var rate=0.53, per=1, nper=12, pv=10000, fv=**whatever you need**, type=**whatever you need**; 或直接:alert(ExcelFormulas.PPMT(0.53, 1, 12, 10000, **whatever fv you need**, **whatever type you need**));
  • 您不是在调用PPMT 函数,而是在调用XIRR 函数。在警报中,您应该有ExcelFormulas. PPMT(0.53, 1, 12, 10000, , )。最后应该有两个值(对于 fvtype)。
  • 谢谢大家!这些答案的结合帮助我弄清楚了,这真的很有帮助。抱歉,回复时间长,我的电脑出了点问题

标签: javascript function object


【解决方案1】:

您的PPMT 函数在定义的顶部有一个控制结构。

    PPMT: function(rate, per, nper, pv, fv, type) {
        // will return null if condition is met
        if (per < 1 || (per >= nper + 1)) return null;
        var pmt = this.PMT(rate, nper, pv, fv, type);
        var ipmt = this.IPMT(pv, pmt, rate, per - 1);
        return pmt - ipmt;
    },

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2021-06-09
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多