2014-12-09 3 views
-1

Я написал функцию javascript, которая принимает несколько переменных для получения результата, что мне нужно сделать, это результат, который равен 0,00 (+/- 0,01), путем корректировки процентного значения, которое передается функции.Итерация результата до 0 javascript

Fiddle: http://jsfiddle.net/jerswell/33vyvm6n/

Если выбран первый элемент из списка вы будете видеть обновления таблицы с результатами и оттуда пользователь может ввести значение в Price ($) поле сказать 100 нажмите высчитывает и панели результатов будет покажите результаты расчета.

YTM, когда выбран 4.371, который производит в результате Price ($) = 8.52

Что мне нужно добиться того, чтобы показать результат 0.00 (+/- 0.01) пути не перебора значения YTM и декрементирования или приращения от 0,001 до этого результата , для этого примера YTM 6.002 приближает нас настолько, что мы довольны изменением выходного сигнала +/- 0.01.

В строке 114 скрипки есть инструкция if, которую я начал, но теперь я застрял как оттуда.

if (bondCalculation.calculatedPrice !== 0) { 

    } 

ответ

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/

+0

Отлично! Большое спасибо очень изящному решению проблемы. –

1

Попробуйте что-то вроде этого, настроить переменные/Params в соответствии с требованиями:

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; 
} 
+0

Спасибо за ответ вы можете посмотреть на Javascript в скрипку и настроить его отразите мой код, чтобы я был уверен в этом. –

Смежные вопросы