Сложная математическая формула в функции jquery не работает

ИЗМЕНЕНО:

Часть функции, связанная с потолком долга, фактически будет использоваться на этапе, о котором я еще не писал. Он используется, чтобы определить, не слишком ли велико отношение долга к доходу пользователя, но не влияет на результат функции, как она написана сейчас.

Однако у меня все еще есть проблема, и я был бы очень признателен за любую информацию. Я думаю, что у меня плохая логика в следующем разделе javasctipt. Вот моя новая функция:

$(function(){

function calculate_affordability() {

    var income = parseFloat($('#income').val());
    var debts = parseFloat($('#debts').val());
    var apr_decimal = parseFloat($('#apr').val()) / 100;
    var monthly_interest = apr_decimal / 12;
    var down = parseFloat($('#down').val());
    var term = parseFloat($('#term').val()) * 12;

    var debts_ceiling = (debts * .08).toFixed(2);
    var mortgage_ceiling = (income * .28).toFixed(2);

    var formula_numerator = Math.pow((1 + monthly_interest), term) -1;
    var formula_denominator = monthly_interest * Math.pow((1 + monthly_interest), term);
    var formula_result = (formula_numerator / formula_denominator);

    var loan_amount = (mortgage_ceiling * formula_result).toFixed(2);

    //  the issue is in here somewhere:
    var closing_costs = (loan_amount * .03).toFixed(2);
    var actual_down = (down - closing_costs);
    var max_purchase_price = (loan_amount + actual_down);

    $('#monthly-payment').html('$' + mortgage_ceiling);
    $('#loan-amount').html('$' + loan_amount);
    $('#max-purchase-price').html('$' + max_purchase_price);
    $('#actual-down').html('$' + actual_down);
    $('#closing-costs').html('$' + closing_costs);

}


$('#term').keyup(calculate_affordability);

$('#term').mouseup(calculate_affordability);

});

Спасибо еще раз за помощь!

ОРИГИНАЛ:

Фактически это расчет ипотеки.

У меня он работает при обычном использовании, то есть для определения ежемесячного платежа, когда пользователь вводит четыре переменные (сумма ссуды, первоначальный взнос, процентная ставка и срок действия).

Но когда я пытаюсь изменить формулу для определения суммы ссуды (калькулятор доступности), я получаю плохие результаты.

Вот оригинальная формула, которую объяснил профессор ипотечного кредитования:

Следующая формула используется для расчета фиксированного ежемесячного платежа (P), необходимого для полной амортизации ссуды в размере L долларов в течение n месяцев с ежемесячной процентной ставкой c. [Если указанная ставка составляет 6%, например, c составляет 0,06 / 12 или 0,005].

P = L[c(1 + c)n]/[(1 + c)n - 1]

http://www.mtgprofessor.com/formulas.htm

Сначала я приведу пример, который работает правильно.

HTML:

<form>
    <div class="col-md-4">
        <h4>Home Price</h4>
            <input type="text" id="price">
        <h4>Down Payment</h4>
            <input type="text" id="down">
    </div>
    <div class="col-md-4">
        <h4>Rate (%)</h4>
            <input type="text" id="apr">
        <h4>Term (Years)</h4>
            <input type="text" id="term">
    </div>
    <div class="col-md-4">
        Your Monthly Payment:
        <div id="payment"></div>
    </div>
</form>

jQuery:

$(function(){

function calculate_monthly_payment() {

    var price = parseFloat($('#price').val());
    var down = parseFloat($('#down').val());
    var apr_decimal = parseFloat($('#apr').val()) / 100;
    var monthly_interest = apr_decimal / 12;
    var term = parseFloat($('#term').val()) * 12;

    var loan_amount = parseFloat(price - down);

    var formula_numerator = monthly_interest * Math.pow((1 + monthly_interest), term);
    var formula_denominator = Math.pow((1 + monthly_interest), term) -1;

    var monthly_payment = parseFloat(loan_amount * (formula_numerator / formula_denominator)).toFixed(2);

    if (!isNaN(monthly_payment)) {
        $('#payment').html('$' + monthly_payment);
    } else {
        $('#payment').html('Calculating...');
    }

}

$('#price').keyup(calculate_monthly_payment);
$('#down').keyup(calculate_monthly_payment);
$('#apr').keyup(calculate_monthly_payment);
$('#term').keyup(calculate_monthly_payment);

$('#price').mouseup(calculate_monthly_payment);
$('#down').mouseup(calculate_monthly_payment);
$('#apr').mouseup(calculate_monthly_payment);
$('#term').mouseup(calculate_monthly_payment);

});

Часть, которая не работает должным образом:

HTML:

<form>
    <div class="col-md-6">
        <h4>Income (Monthly)</h4>
            <input type="text" id="income">
        <h4>Debts (Monthly, not including housing costs)</h4>
            <input type="text" id="debts">
        <h4>Down Payment</h4>
            <input type="text" id="down">
        <h4>Rate (%)</h4>
            <input type="text" id="apr">
        <h4>Term (Years)</h4>
            <input type="text" id="term">
    </div>
    <div class="col-md-6">
        Monthly Payment:
        <div id="monthly-payment"></div>
        Loan Amount:
        <div id="loan-amount"></div>
        Purchase Price:
        <div id="purchase-price"></div>
        Down Payment:
        <div id="actual-down"></div>
        Closing Costs:
        <div id="closing-costs"></div>
    </div>
</form>

jQuery:

$(function(){

function calculate_affordability() {

    var income = parseFloat($('#income').val());
    var debts = parseFloat($('#debts').val());
    var down = parseFloat($('#down').val());
    var apr_decimal = parseFloat($('#apr').val()) / 100;
    var monthly_interest = apr_decimal / 12;
    var term = parseFloat($('#term').val());

    var debt_ceiling = income * .08;
    var monthly_payment = (income * .28).toFixed(2);

    var formula_numerator = monthly_interest * Math.pow((1 + monthly_interest), term);
    var formula_denominator = Math.pow((1 + monthly_interest), term) -1;

    var loan_amount = parseFloat(monthly_payment / (formula_numerator / formula_denominator)).toFixed(2);
    var closing_costs = (loan_amount * .03).toFixed(2);
    var actual_down = (down - closing_costs).toFixed(2);
    var purchase_price = (loan_amount - actual_down).toFixed(2);


    $('#monthly-payment').html('$' + monthly_payment);
    $('#loan-amount').html('$' + loan_amount);
    $('#purchase-price').html('$' + purchase_price);
    $('#actual-down').html('$' + actual_down);
    $('#closing-costs').html('$' + closing_costs);

}


$('#term').keyup(calculate_affordability);

$('#term').mouseup(calculate_affordability);

});

Вышесказанное основано на просмотре формулы и ее перестановке.

Исходный: x = y (a / b)

Решение относительно y: y = x / (a ​​/ b)

Как-то я ошибся с новой формулой, но не знаю, где и как ее исправить.

Спасибо за любую помощь!


person Jeannie    schedule 10.09.2013    source источник


Ответы (3)


новая формула становится L = P / [(1 + c) ^ n-1] / [c (1 + c) ^ n]

позвольте мне решить это за вас. Чтобы добавить L к другой стороне, вам нужно умножить на 1 / L. так что теперь левая часть уравнения - P / L. чтобы избавиться от P, вам нужно умножить на 1 / P. теперь оставив L в покое, соотношение L будет 1 / L. Чтобы избавиться от одного, вам нужно перевернуть уравнение в правой части. так что вы получите новую формулу выше.

person frank    schedule 07.07.2015

Ваш ежемесячный платеж неправильно рассчитывается в коде, который не работает должным образом. Если вы посмотрите на это, вы увидите, что вы вообще не учитываете свои долги.

Я не совсем уверен, как вы решите рассчитывать ежемесячный платеж, но я предполагаю, что вам нужно вычесть свои долги из своего дохода, а затем вычислить потолок, возможно, что-то вроде этого:

var debt_ceiling = (income - debts) * .92;
var monthly_payment = (debt_ceiling * .28).toFixed(2);

Или что-то в этом роде ... но, думаю, в этом твоя ошибка.

person Jay Taplin    schedule 11.09.2013

Полурешенный:

Проблема была в моей формуле и с коллегой, и я понял главную проблему. Когда я преобразовал исходную формулу (которую я не обрисовал здесь очень подробно), я не применил правильный алгебраический метод обращения того, что было сделано с одной стороной уравнения на другой стороне. По сути, дробный бит исходной формулы нужно было перевернуть и умножить. Итак, вот новая формула, решающая для L, а не для P:

L = P[(1 + c)^n -1]/[c(1 + c)^n]

А в оригинале морковь означает «возведенная в степень n»: P = L [c (1 + c) ^ n] / [(1 + c) ^ n - 1]

Тем не менее, проблема все еще существует, и я добавил ее к своему первоначальному вопросу.

person Jeannie    schedule 11.09.2013