Soy nuevo en Javascript y estoy tratando de hacer un cálculo que cambia según el número que se escribe en la entrada. Sin embargo, las funciones convierten la salida en un NaN, por lo que me pregunto si puedo transformar el NaN en un número normal (para poder agregar hUeCalc y massCalc y mostrarlo como un número) para usar o si tengo que usar otra opción para hacer los cálculos.
Tal vez el cambio y el caso podrían ser una opción, pero no estoy muy seguro de si tendrían el efecto que necesito.
En el Código a continuación, puede ver la función que se ejecuta cuando se presiona un botón. En este momento, cuando hago clic en el botón que activa la función calc, obtengo NaN en tax.innerHTML en lugar de un número.
Gracias por adelantado.
function calc() { let hubraum = Number(hubraumComponent.value); let emission = Number(emissionComponent.value); let masse = Number(masseComponent.value); let hUeCalc = Number(function (){ if (Diesel.checked == true) { ((Math.ceil((hubraum/100)))*9.5)+((emission-95)*2); } else if (Benzin.checked == true) { ((Math.ceil((hubraum/100)))*2)+((emission-95)*2); }; }); let masseCalc = Number(function (){ let masseValue; if (masse <= 2000) { masseValue = (Math.ceil((masse/200)*5.625)); } else if (masse >= 3000) { masseValue =(Math.ceil((masse/200)*6.01)); } else if (masse >= 3500) { masseValue = (Math.ceil(masse/200)*6.39); }; }); // let masseValue = (Math.ceil (masse/200)); let berechnung = (hUeCalc + masseCalc); tax.innerHTML = (berechnung) + "€"; console.log('Calc has been done'); console.log('hubraum value is ' + hubraum); console.log('emission value is ' + emission); console.log('masse value is ' + masse); console.log('hubraumcalc value is ' + hUeCalc); console.log('massecalc value is ' + masseCalc); }También aquí está el HTML en caso de que quieras ver el botón que activa todo esto
<div class="input-field-second-calc" onclick="calc()"> <input type="button" class="btn btn-outline-primary" value="berechnen"> <br> <a id="tax"></a> </div>¡Necesita devolver un valor en sus dos funciones!
Cuando tu lo hagas :
let hUeCalc = Number(function (){ if (Diesel.checked == true) { ((Math.ceil((hubraum/100)))*9.5)+((emission-95)*2); } else if (Benzin.checked == true) { ((Math.ceil((hubraum/100)))*2)+((emission-95)*2); }; }) Básicamente, está diciendo que convierta el valor de retorno de la función en un número y asígnelo a hUeCalc . Pero como la función no devuelve nada. Está tratando de convertir indefinido en un número. que dan NaN como resultado.
Lo mismo va para :
let masseCalc = Number(function (){ let masseValue; if (masse <= 2000) { masseValue = (Math.ceil((masse/200)*5.625)); } else if (masse >= 3000) { masseValue =(Math.ceil((masse/200)*6.01)); } else if (masse >= 3500) { masseValue = (Math.ceil(masse/200)*6.39); }; });Por cierto, con:
if (masse <= 2000) { masseValue = (Math.ceil((masse/200)*5.625)); } else if (masse >= 3000) { masseValue =(Math.ceil((masse/200)*6.01)); } else if (masse >= 3500) { masseValue = (Math.ceil(masse/200)*6.39); }; Nunca llegarás a lo último else if lo intentamos con 3700, por ejemplo. No coincidirá con el primero si pero con el segundo ya que 3700 es mayor que 3000. Debe invertir el orden de los dos si.
Y también debe agregar otra cosa para el número entre 2000 y 3000 (si es un valor aceptado)
Una refactorización de código debe separar ambos cálculos actuales, cada uno en una parte que proporciona/implementa una única función de cálculo especializada y una parte que invoca el cálculo con los valores correctos, incluidos los valores alternativos válidos en caso de que no se puedan cumplir algunas condiciones.
Además sugiero arreglar el naming. No mezcles los idiomas. Omita la parte alemana ya que la mayor parte del código (incluido el registro) se nombra y comenta en inglés.
function getCalculatedHUeValue(displacement, emission, fuelFactor) { return (Math.ceil(displacement / 100) * fuelFactor) + ((emission - 95) * 2); } function getCalculatedMassValue(mass, massFactor) { return Math.ceil(mass / 200 * massFactor); } function calc() { const displacement = Number(displacementComponent.value); const emission = Number(emissionComponent.value); const mass = Number(massComponent.value); const hUeCalc = getCalculatedHUeValue(displacement, emission, (Diesel.checked && 9.5) || (Benzin.checked && 2) || 0 // default/fallback value needs to be provided/known. ); const massCalc = getCalculatedMassValue(mass, ((mass <= 2000) && 5.625) || ((mass >= 3500) && 6.39) || ((mass >= 3000) && 6.01) || // what is the factor for the uncovered // mass range in between 2001 and 2999? 0 // this fallback value has to be provided/known. ); const result = (hUeCalc + massCalc); tax.innerHTML = (result + "€"); console.log('Calculation is done'); console.log('displacement value is ' + displacement); console.log('emission value is ' + emission); console.log('mass value is ' + mass); console.log('hUeCalc value is ' + hUeCalc); console.log('massCalc value is ' + massCalc); }Si prueba el siguiente código, creo que debería funcionar. Como puede ver, si desea utilizar una función para asignar un valor, la función tiene que devolver algo, si no es así, no hay valor para asignar. También debe asegurarse de que la función se ejecute, si no lo hace, let hUeCalc = function(){} simplemente se convierte en el identificador de la función.
function calc() { let hubraum = Number(hubraumComponent.value); let emission = Number(emissionComponent.value); let masse = Number(masseComponent.value); let hUeCalc = Number(function (){ if (Diesel.checked == true) { return ((Math.ceil((hubraum/100)))*9.5)+((emission-95)*2); } else if (Benzin.checked == true) { return ((Math.ceil((hubraum/100)))*2)+((emission-95)*2); }; }()); let masseCalc = Number(function (){ let masseValue; if (masse <= 2000) { return masseValue = (Math.ceil((masse/200)*5.625)); } else if (masse >= 3000) { return masseValue =(Math.ceil((masse/200)*6.01)); } else if (masse >= 3500) { return masseValue = (Math.ceil(masse/200)*6.39); }; }()); // using () right after the function makes it so it get excecuted immediately // let masseValue = (Math.ceil (masse/200)); let berechnung = (hUeCalc + masseCalc); tax.innerHTML = (berechnung) + "€"; console.log('Calc has been done'); console.log('hubraum value is ' + hubraum); console.log('emission value is ' + emission); console.log('masse value is ' + masse); console.log('hubraumcalc value is ' + hUeCalc); console.log('massecalc value is ' + masseCalc); }