【问题标题】:Building a JavaScript Calculator from scratch?从头开始构建 JavaScript 计算器?
【发布时间】:2019-03-11 10:26:07
【问题描述】:

我正在尝试从头开始构建一个 JavaScript 计算器,而不遵循教程,作为学习练习。大部分功能都在工作,除非一个计算是一个接一个地执行的。 IE: 7 x 6 + 42 在这种情况下,它会将显示重置为 0,但似乎仍然保留该变量。

是否有必要将数字存储为 3 个值,而不是 2 个?目前我正在使用: -currentValue,保存之前的计算总数。 -newValue,即用户当前输入的数字。

function newNum(pressed) { //Adds digit of key pressed to new number being entered.
  //console.log ("Button pressed " + pressed);

  if (newValue == 0) { //If new calculation, newValue is set to key pressed.
    newValue += pressed;
  } else { //Else if continuing calculation, key pressed is added to end of newValue.
    newValue = newValue.toString();
    newValue = newValue + pressed; //Adds digit at end of String, then converts back to Number.
    newValue = parseFloat(newValue);
  }
  document.getElementById('result').innerHTML = newValue;
}

function newCalc(pressed) { //Will use this mathematical operation to find the value.
  if (!currentValue) {
    currentValue = newValue;
  } else {
    document.getElementById('result').innerHTML = newValue;
  }

  newOperation = pressed;
  newValue = 0;
}

function equals() { //Resolves calculation.
  newValue = parseFloat(newValue);

  switch(newOperation) {
    case "/":
        currentValue = (currentValue / newValue);
        break;
    case "*":
        currentValue = (currentValue * newValue);
        break;
    case "-":
        currentValue = (currentValue - newValue);
        break;
    case "+":
        currentValue = (currentValue + newValue);
        break;
  }

  currentValue = parseFloat(currentValue);
  newValue = 0;
  document.getElementById('result').innerHTML = currentValue;
}

https://codepen.io/adam_weiler/pen/aRNppX

我还在学习,我知道代码有点臃肿。任何如何简化它的建议也会有所帮助!

编辑:我举了一个不好的例子。我只是在编写一个基本的计算器,您可以在其中点击按钮输入数字。它不使用 BEDMAS;操作的顺序是“用户输入它们的顺序”。所以,是的,只是一个基本的攻丝计算器。

【问题讨论】:

    标签: javascript calculator


    【解决方案1】:

    在您的示例中,代码尝试同时计算 7*6 和 6+42,但是没有 6 可以添加到 42 因为它被乘以 7,所以它不能来计算。您应该对操作偏好制定规则,当有乘法或除法时,应将周围的数字计算为新数字,然后您可以通过加法或减法进一步操作。另外,你也应该定义从左到右的规则,所以如果你有 2*3/4 那么错误就不会再发生了。

    【讨论】:

    • 表达式解析!多么有趣!我已经这样做了几次,但我不会向初学者推荐它......
    • 是的,你是对的,但我认为一次计算中使用超过 2 个数字也不适合初学者。至少我看不出用他的方法或者至少用类似于他的方法怎么做
    • 我认为他正在尝试创建一个“经典”计算器。例如,当您按下操作或= 时,之前的操作将得到解决,您无法再返回。所以按2+2x2 确实会产生 8。
    • 哦,那我误解了问题对不起!在这种情况下,每当一个由 2 个数字包围的运算和一个新的表达式或 = 添加时,应该计算前 2 个数字并且它将起作用。
    【解决方案2】:

    如果你输入

     7 | x | 8 | = | + | 5 | = |
    

    它可以正常工作。我猜你想在按下操作按钮时执行equals(),而不仅仅是=...

    是否需要将数字存储为 3 个值而不是 2 个?

    不,您不必这样做。诀窍是一个接一个地执行一个操作,所以你总是只使用两个值:

     7
     7 x
     7 x 8
     7 x 8 +
     46 + // merged
     46 + 5
     46 + 5 =
     51 // merged
    

    【讨论】:

    • 如果我每次计算按钮(+ - * /)时都执行equals()函数,那么它将newValue重置为0。我想我必须更改equals()函数才能实现它需要在没有重置的情况下第一次运行,然后它可以计算/重置以下时间。
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多