Я пытаюсь создать калькулятор JavaScript с нуля, не следуя руководству, в качестве учебного упражнения. Большая часть функций работает, за исключением случаев, когда вычисления выполняются сразу после других. то есть: 7 х 6 + 42 В этом случае он сбрасывает отображение на 0, но, похоже, все равно сохраняет переменную.
Нужно ли хранить числа в 3 значениях вместо 2? В настоящее время я использую: -текущая стоимость, который содержит предыдущую сумму расчета. -newValue - номер, который пользователь вводит в данный момент.
function newNum(pressed) { //Adds digit of key pressed to new number being entered.
//console.info ("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 [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем примере код пытается вычислить 7 * 6 и 6 + 42 одновременно, но нет 6, которое можно было бы добавить к 42, потому что оно было умножено на 7, поэтому его нельзя вычислить с помощью . Вы должны установить правила для предпочтения операции, когда происходит умножение или деление, округляющие числа должны быть рассчитаны как новое число, а затем вы можете продолжить работу с вашим сложением или вычитанием. Кроме того, вы должны определить правило слева направо, поэтому, если у вас есть 2 * 3/4, ошибка больше не возникнет.
Да, вы правы, но работать с более чем двумя числами в расчете сразу тоже не для новичка, я думаю. По крайней мере, я не понимаю, как еще это можно сделать с помощью его метода или, по крайней мере, с помощью метода, похожего на его
Я думаю, он пытается создать «классический» калькулятор. Например, когда вы нажимаете операцию или =, предыдущая операция разрешается, и вы больше не можете вернуться. Таким образом, нажатие 2+2x2 действительно даст 8.
Ох, тогда я неправильно понял проблему, извините! В этом случае всякий раз, когда операция окружена двумя числами и добавляется новое выражение или знак =, должны быть вычислены первые два числа, и они будут работать.
Если вы введете
7 | x | 8 | = | + | 5 | = |
работает без проблем. Я предполагаю, что вы хотите запускать equals() всякий раз, когда нажимается кнопка операции, а не только на = ...
Is it necessary to store the numbers in 3 values, instead of 2?
Нет, не обязательно. Хитрость заключается в том, чтобы выполнять одну операцию за другой, чтобы вы всегда работали только с двумя значениями:
7
7 x
7 x 8
7 x 8 +
46 + // merged
46 + 5
46 + 5 =
51 // merged
Если я выполняю функцию equals () каждый раз, когда нажимаю кнопку вычисления (+ - * /), то она сбрасывает newValue на 0. Я думаю, мне придется изменить функцию equals (), чтобы понять, что она должна запускаться в первый раз. без сброса, тогда он может вычислить / сбросить следующие времена.
Разбор выражений! Как весело! Я делал это пару раз, но новичку не рекомендовал бы ...