迭代结果直到0 javascript

时间:2014-12-09 11:40:01

标签: javascript jquery math iteration

我编写了一个javascript函数,它接受一些变量来产生一个结果,我需要做的是通过调整传递给函数的百分比值来产生0.00(+/- 0.01)的结果。 / p>

小提琴:http://jsfiddle.net/jerswell/33vyvm6n/

如果您从列表中选择第一项,您会看到包含结果的表格更新,然后用户可以在Price ($)字段中输入值100点击计算,结果面板将显示计算结果。

选择的YTM为4.371,会产生Price ($) = 8.52

的结果

我需要实现的是通过迭代YTM值并递减或递增0.001来显示0.00 (+/- 0.01)的结果,直到达到此结果,对于此示例,6.002的YTM得到我们我们对输出中的+/- 0.01变化感到满意。

在小提琴的114行上有一个我已经开始的if语句,但我现在被困在这里。

    if (bondCalculation.calculatedPrice !== 0) {

    }

2 个答案:

答案 0 :(得分:1)

尝试这样的事情,根据需要调整变量/参数:

if(calculatedPrice !== 0){
   var currentPrice = calculatedPrice;
   var adjustedYTM =  ytm + 0.01;
   calculatedPrice = calculatePrice(ytm, other, params);

   if(calculatedPrice > currentPrice)
       adjustedYTM = decrementYTM(ytm);
   else
       adjustedYTM = incrementYTM(ytm);

    ytm = adjustedYTM;
}

function incrementYTM(ytm){
    while(calculatedPrice > 0){
        ytm += 0.01;
        calculatedPrice = calculatePrice(ytm, other, params);
    }
    return ytm;
}

function decrementYTM(ytm){
    while(calculatedPrice > 0){
        ytm -= 0.01;
        calculatedPrice = calculatePrice(ytm, other, params);
    }
    return ytm;
}

答案 1 :(得分:1)

二进制搜索将起作用。我们的想法是从低YTM值0和高值(例如12000)开始。然后取出低值和高值的平均值,查看误差,并相应地调整低端或高端。继续这样做,直到错误足够小。

您可以替换

    if(bondCalculation.calculatedPrice !== 0) {

    }

    function getPrice(ytm) {
        return bondCalc(bond_term, bond_coupons, bond_semi_function, ytm, bondFaceValue, xtbPrice).calculatedPrice;
    }
    var low = 0, high = 12000, ytm;
    var count = 0;
    while (true) {
        count += 1;
        if (count == 100) {
            break;
        }
        ytm = (low+high)/2;
        if (Math.abs(getPrice(ytm)) < 0.0001) {
            break;
        } else if (getPrice(ytm) > 0) {
            low = ytm;
        } else {
            high = ytm;
        }
    }
    ytm = Math.round(1000*ytm)/1000;
    yieldToMaturity.val(ytm);
    bond_indicative_yield = ytm;
    bondCalculation = bondCalc(bond_term, bond_coupons, bond_semi_function, bond_indicative_yield, bondFaceValue, xtbPrice);

获得这个小提琴:http://jsfiddle.net/yow44mzm/

相关问题