Estoy haciendo una calculadora de fórmula cuadrática. No hay errores, pero cuando lo ejecuto devuelve NaN. No entiendo porque.
function quadratic(a, b, c) { a = document.getElementById("a").value; b = document.getElementById("b").value; c = document.getElementById("c").value; var equation = Math.sqrt((b * b) - ( 4 * a * c)); var quadraticPos =(-b + equation) / (2 * a); var quadraticNeg = (-b - equation) / (2 * a); if (isNaN(a) || isNaN(b) || isNaN(c)) { alert("Invalid Input"); } else { document.getElementById("quadraticOut").innerHTML = "Quadratic Equation = " + quadraticPos.toFixed(2) + "<br/>" + quadraticNeg.toFixed(2); } }
input { width: 20px }
<input id="a" placeholder="a"/> <input id="b" placeholder="b"/> <input id="c" placeholder="c"/> <button onclick="quadratic()">compute</button> <div id="quadraticOut">result…</div>
La verificación de entrada debe venir antes del cálculo real.
a
, b
y c
son cadenas por defecto, no números, cuando provienen de los campos de entrada a través .value
. Deben convertirse a Number()
antes de usarse en el cálculo. O bien, podrías multiplicar por un número, pero eso es un truco. Si b*b
multiplica dos cadenas, el producto será un número debido a la coerción de tipo, pero esto no es sólido y no debe confiar en rarezas de JavaScript como esta para que su cálculo funcione.
Math.sqrt()
devuelve NaN si el resultado es un número negativo, que es muy probable que se obtenga aquí con valores de entrada aleatorios.
Su <br/>
en el HTML interno causará un error, debe poner comillas alrededor.
En 2021, sería mejor usar let
y/o const
para limitar el alcance de la variable, en lugar de la var
global.