从头开始构建JavaScript计算器?

3
我正在尝试从头开始构建一个JavaScript计算器,作为学习练习而不是按照教程。很多功能都正常工作,除非在另一个计算之后立即执行计算。例如: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;操作顺序是“用户输入的顺序”。所以,这只是一个基本的点击计算器。

2个回答

0
如果您输入:
 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()函数以认识到它需要在第一次运行时不进行重置,然后它可以在接下来的运行中进行计算/重置。 - Adam Weiler

0
在您的示例中,代码尝试同时计算7*6和6+42,但是没有6可以加到42上,因为它被乘以7,所以无法进行计算。您应该制定操作优先级规则,当有乘法或除法时,周围的数字应计算为新数字,然后您可以进一步进行加法或减法运算。此外,您还应定义从左到右的规则,这样如果您有2*3/4,则不会再次出现错误。

2
表达式解析!多有趣啊!我做过几次,但不建议初学者尝试... - Vilx-
是的,你说得对,但是一次计算中使用超过2个数字也不适合初学者。至少我不知道还有什么其他方法可以用他的方法或类似的方法来完成。 - Patrik Alexits
1
我认为他试图创建一个“经典”的计算器。也就是说,当您按下操作或=时,先前的操作会得到解决,您将无法再返回。因此,按下2+2x2确实会产生8。 - Vilx-
哦,那我误解了问题,抱歉!在这种情况下,每当两个数字和一个新表达式或等号包围的操作被添加时,应计算前两个数字,然后它就可以工作了。 - Patrik Alexits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接