Tengo que reparar esta calculadora de hipotecas, pero realmente no entiendo por qué el cálculo no funciona. Necesito ayuda para solucionar esto. O al menos alguien que me haga entender qué está mal con esta función. (La calculadora tiene una entrada para el ingreso anual combinado de los solicitantes y otra entrada para el depósito. La calculadora debe mostrar resultados para el valor máximo de la propiedad y los costos mensuales estimados).

function PMT (rate_per_period, number_of_payments, present_value, future_value, type ) {
        var q = Math.pow(1 + rate_per_period, number_of_payments);
        return (rate_per_period * (future_value + (q * present_value))) / ((-1 + q) * (1 + rate_per_period * (type)));
}

jQuery(document).ready(function ($) {

        $(".input").keyup(function () {
            var annualIncomeInput = 0;
            var depositInput = 0;
            var annualIncome = 0;
            var deposit = 0;
            var mortgage = 0;
            var propertyValue = 0;
            var monthlyPayments = 0;
            annualIncomeInput = $('#annualIncome').val();
            depositInput = $('#deposit').val();
            annualIncome = parseFloat(annualIncomeInput.replace(/,/g, ''));
            deposit = parseFloat(depositInput.replace(/,/g, ''));
            if (annualIncomeInput && depositInput) {
                if ((deposit / 0.1 - deposit) >= (annualIncome * 4.5)) {
                    mortgage = annualIncome * 4.5;
                    propertyValue = mortgage + deposit;
                } else {
                    propertyValue = deposit / 0.1;
                    mortgage = propertyValue - deposit;
                }
                monthlyPayments = PMT(0.0307/12, 30*12, mortgage, 0, 0).toFixed(2);
            }
            
            propertyValue = parseFloat(propertyValue).toLocaleString();
            monthlyPayments = parseFloat(monthlyPayments).toLocaleString();
            $('#totalHowMuchCanIBorrow').text('£' + propertyValue);
            $('#estimatedCosts').text('£' + monthlyPayments);
            
        })
    })

Si necesita más detalles, hágamelo saber. ¡Gracias!

0
Elisabeta Aionese 27 nov. 2021 a las 11:48
¿Qué hace ahora que no es lo que esperabas? Sería útil si reemplazara los números mágicos con constantes nombradas para explicar qué son los números. ¿Qué es 4.5 o 0.0307?
 – 
Tom W
27 nov. 2021 a las 11:53
W Creo que son solo algunas reglas empíricas para calcularlo. Pero tampoco entienda exactamente qué debería salir mal. Puede agregar un ejemplo de cuál debería ser el resultado o intentar escribir el formulario como debería ser y podríamos ayudarlo a encontrar el error en la implementación.
 – 
Mucksh
27 nov. 2021 a las 12:11
¿Pero no funciona en absoluto o simplemente no es el resultado correcto?
 – 
Mucksh
27 nov. 2021 a las 12:21
@TomW, PMT = La función PMT se clasifica en funciones financieras de Excel. La función ayuda a calcular el pago total (principal e intereses) requerido para liquidar un préstamo o una inversión con una tasa de interés fija durante un período de tiempo específico. El 0.0307 / 12 = tasa. Encontré en Internet (PMT (rate, nper, pv, [fv], [type])). El 4,5 significa - 4,5 veces su salario.
 – 
Elisabeta Aionese
27 nov. 2021 a las 12:21
1
En el código, Jquery es posterior a HTML. Voy a hacer algunos cambios y volveré con mi respuesta. ¡Gracias!
 – 
Elisabeta Aionese
27 nov. 2021 a las 12:35

1 respuesta

La mejor respuesta

Esto funciona, tal vez encuentre el error comparándolo con el suyo :) no cambió nada, solo le agregué el html apropiado

function PMT(rate_per_period, number_of_payments, present_value, future_value, type) {
  var q = Math.pow(1 + rate_per_period, number_of_payments);
  return (rate_per_period * (future_value + (q * present_value))) / ((-1 + q) * (1 + rate_per_period * (type)));
}

jQuery(document).ready(function($) {
  //not sure how your html looks but maybe here you want $("input") and not $(".input") that selects all elements with the css class input that's maybe missing in the html
  $(".input").keyup(function() {
    var annualIncomeInput = 0;
    var depositInput = 0;
    var annualIncome = 0;
    var deposit = 0;
    var mortgage = 0;
    var propertyValue = 0;
    var monthlyPayments = 0;
    annualIncomeInput = $('#annualIncome').val();
    depositInput = $('#deposit').val();
    annualIncome = parseFloat(annualIncomeInput.replace(/,/g, ''));
    deposit = parseFloat(depositInput.replace(/,/g, ''));
    if (annualIncomeInput && depositInput) {
      if ((deposit / 0.1 - deposit) >= (annualIncome * 4.5)) {
        mortgage = annualIncome * 4.5;
        propertyValue = mortgage + deposit;
      } else {
        propertyValue = deposit / 0.1;
        mortgage = propertyValue - deposit;
      }
      monthlyPayments = PMT(0.0307 / 12, 30 * 12, mortgage, 0, 0).toFixed(2);
    }

    propertyValue = parseFloat(propertyValue).toLocaleString();
    monthlyPayments = parseFloat(monthlyPayments).toLocaleString();
    $('#totalHowMuchCanIBorrow').text('£' + propertyValue);
    $('#estimatedCosts').text('£' + monthlyPayments);

  })
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input class="input" id='annualIncome' type="number">
<input class="input" id='deposit' type="number">
<div id="totalHowMuchCanIBorrow"></div>
<div id="estimatedCosts"></div>
0
Gerard 27 nov. 2021 a las 13:33
1
¡Eres precioso! ¡Salvaste mi día! La clase de entrada fue un problema. Otro problema: donde el código jquery se inicializó en HTML. ¡Gracias!
 – 
Elisabeta Aionese
27 nov. 2021 a las 13:24