-1

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

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

在下面的代码中,您可以看到按下按钮时执行的功能。现在,当我单击激活函数 calc 的按钮时,我在 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) + "€&quot;;
    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>
4

3 回答 3

0

您需要在两个函数中返回一个值!

当你这样做:

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

您基本上是说请将函数的返回值转换为数字并将其分配给hUeCalc. 但是作为函数什么都不返回。它正在尝试将 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 但在第二个上匹配,因为 3700 大于 3000。您需要反转两个 else if 的顺序。

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

于 2021-10-29T09:40:44.437 回答
0

代码重构应将当前计算分别分成提供/实现单个专用计算函数的部分和使用正确值调用计算的部分,包括有效的回退值,以防某些条件无法满足。

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

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 + "€&quot;);

  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);
}
于 2021-10-29T10:28:01.550 回答
-1

如果您尝试以下代码,我认为它应该可以工作。正如你所看到的,如果你想使用一个函数来赋值一个值,这个函数必须返回一些东西,如果它没有,就没有要赋值的值。你还需要确保函数被执行,如果你不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) + "€&quot;;
    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);
}
于 2021-10-29T09:47:01.997 回答