如何防止各种数值计算的 NaN as return 值?

How does one prevent NaN as return value of various number value calculations?

我是 Javascript 的新手,我正在尝试进行计算,该计算会根据输入到输入中的数字而变化。 然而,这些函数将输出转换为 NaN,所以我想知道我是否可以将 NaN 转换为普通数字(以便我可以将 hUeCalc 和 massCalc 加在一起并将其显示为数字)来使用,或者我是否必须使用其他选项做计算。

也许 switch 和 case 可能是一个选项,但我不太确定它们是否会达到我需要的效果。

在下面的代码中,您可以看到按下按钮时执行的功能。现在,当我单击激活函数计算的按钮时,我在 tax.innerHTML 中得到 NaN 而不是数字。

提前致谢。

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);
}

这里还有 HTML,如果您想查看激活所有这些的按钮

<div class="input-field-second-calc" onclick="calc()">
                <input type="button" class="btn btn-outline-primary" value="berechnen">
                <br>
                <a id="tax"></a>
            </div>

您需要在您的两个函数中 return 一个值!

当你这样做时:

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);
    };
})

你基本上是说请将函数的 return 值转换为数字并将其分配给 hUeCalc。但是作为函数return没什么。它正在尝试将 undefined 转换为数字。结果为 NaN。

同样适用于:

 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);
    };
});

顺便说一句,与:

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);
};

你永远不会到达最后一个 else if 就像我们用 3700 来尝试一样。它不会在第一个 if 上匹配,但在第二个 if 上匹配,因为 3700 大于 3000。您需要颠倒这两个 else if.

的顺序

你还需要为 2000 到 3000 之间的数字添加一个 else(如果它是一个可接受的值)

如果您尝试以下代码,我认为它应该可以工作。如您所见,如果您想使用一个函数来赋值,该函数必须 return 某些东西,如果没有,则没有要分配的值。您还需要确保函数已执行,否则 let hUeCalc = function(){} 将成为函数标识符。

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);
}

代码重构应该将两个当前计算分成 provides/implements 一个单独的专门计算函数的一部分和一个使用正确值调用计算的部分,包括有效的回退值,以防某些条件无法满足遇见了

此外,我建议修改命名。不要混合语言。跳过德语部分,因为大部分代码(包括日志记录)都是用英语命名和注释的。

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);
}