【问题标题】:Adding numbers and receiving a NaN添加数字并接收 NaN
【发布时间】:2021-08-20 20:01:00
【问题描述】:

我有这段代码,它的 javascript 并且正在使用 cs.js(Minecraft 1.8 的 Chattriggers)

register('command', function(...arguments) {
  ChatLib.chat(arguments.length);
  if (arguments.length % 2 != 0) {
    for (argument in arguments) {
      arg = arguments[argument];
      if (isNaN(parseInt(arg))) {
        let num1 = parseFloat(arguments[argument - 1]);
        let num2 = parseFloat(arguments[argument + 1]);
        let equals = 0;
        switch (arg) {
          case "+":
            equals = num1 + num2;
            ChatLib.chat(`${color.GREEN}Success!`);
            ChatLib.chat(`${color.GREEN}` + equals.toString());
            break;
          case "-":
            equals = num1 - num2;
            ChatLib.chat(`${color.GREEN}Success!`);
            ChatLib.chat(`${color.GREEN}` + equals.toString());
            break;
          case "*":
            equals = num1 * num2;
            ChatLib.chat(`${color.GREEN}Success!`);
            ChatLib.chat(`${color.GREEN}` + equals.toString());
            break;
          case "/":
            equals = num1 / num2;
            ChatLib.chat(`${color.GREEN}Success!`);
            ChatLib.chat(`${color.GREEN}` + equals.toString());
            break;
          case "%":
            equals = num1 % num2;
            ChatLib.chat(`${color.GREEN}Success!`);
            ChatLib.chat(`${color.GREEN}` + equals.toString());
            break;
          default:
            ChatLib.chat(`${color.RED}${color.UNDERLINE}WOAH THERE BUCKO! ${color.RESET}${color.GOLD}You're only allowed to do single operations, do /calc help if you need help with the syntax.`);
            break;
        }
      }
    }
  }
}).setName("calc");

每当我运行它时,7 + 3 它返回 NaN 给我,我注意到它在等于区域附近的某个地方,就像我在进行调试时它似乎出错的地方一样。我尝试尽可能多地进行研究,但我找不到任何有类似问题的人,运行代码我没有看到任何问题,除了那里可能效率低下。似乎出错的部分是:

equals = num1 + num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;

非常感谢任何帮助,这变得非常令人沮丧。

【问题讨论】:

    标签: javascript debugging math nan minecraft


    【解决方案1】:

    这是问题的根源:

    for (argument in arguments) {
    

    虽然arguments 是一个数组,但这会导致argument 成为每个元素的文本属性,因此您最终会迭代"0"、"1" 和"2"。

    单独使用它的地方,例如这里:

    arg = arguments[argument];
    

    它正在寻找正确的元素。当它到达它试图获取前一个和下一个元素的部分时,它部分工作。这行没问题:

    let num1 = parseFloat(arguments[argument - 1]);
    

    这行不是:

    let num2 = parseFloat(arguments[argument + 1]);
    

    这是因为 - 在减 1 之前将 argument 转换为一个数字,而 + 运算符正在进行字符串连接,因此您最终会寻找:

    let num2 = parseFloat(arguments["11"]);
    

    由于参数没有属性 11,num2 最终成为 NaN。

    一个简单的解决方法是更新你的 for 循环以显式循环数字索引,而不是命名属性(在数组中恰好是数字索引的字符串表示形式):

    for (let argument = 0; argument < arguments.length; argument++) {
    

    function f(...arguments) {
      console.log(arguments.length);
      if (arguments.length % 2 != 0) {
        for (let argument = 0; argument < arguments.length; argument++) {
          arg = arguments[argument];
          if (isNaN(parseInt(arg))) {
            let num1 = parseFloat(arguments[argument - 1]);
            let num2 = parseFloat(arguments[argument + 1]);
            let equals = 0;
            switch (arg) {
              case "+":
                equals = num1 + num2;
                console.log(`Success!`);
                console.log(equals.toString());
                break;
              case "-":
                equals = num1 - num2;
                console.log(`Success!`);
                console.log(equals.toString());
                break;
              case "*":
                equals = num1 * num2;
                console.log(`Success!`);
                console.log(equals.toString());
                break;
              case "/":
                equals = num1 / num2;
                console.log(`Success!`);
                console.log(equals.toString());
                break;
              case "%":
                equals = num1 % num2;
                console.log(`Success!`);
                console.log(equals.toString());
                break;
              default:
                console.log(`WOAH THERE BUCKO! You're only allowed to do single operations, do /calc help if you need help with the syntax.`);
                break;
            }
          }
        }
      }
    }
    
    f("3", "+", "7")

    【讨论】:

    • 非常感谢,我什至没有想到它是字符串而不是数字的事实
    猜你喜欢
    • 2020-04-24
    • 2020-09-05
    • 2020-09-01
    • 1970-01-01
    • 2015-03-16
    • 2011-10-14
    • 2020-02-13
    • 2018-10-02
    • 2013-03-05
    相关资源
    最近更新 更多