我编写了一个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) {
}
答案 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/