Вот на работающем примере сразу стали понятны ваши проблемы.
Нельзя смешивать в одном input значения и операции, т.к. в результате происходит задвоение операторов. Их, конечно, легко отфильтровать при вводе данных из input, но возникает другая проблема: минус может быть как оператором, так и частью значения, например, как результат вычисления 1-2=-1.
Поэтому операторы лучше показывать в другом input. При этом бонус - появляется возможность вести полный протокол
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calculator</title>
</head>
<body>
<table>
<tr>
<td>
<input id="action" type="text" value="" size="16" class="display" readonly="readonly" />
</td>
<td>
<input id="screen" type="text" value="" size="16" class="display" readonly="readonly" />
</td>
</tr>
</table>
<table>
<tr>
<td><input type="button" value="1" onclick="addInput(1)"/></td>
<td><input type="button" value="2" onclick="addInput(2)"/></td>
<td><input type="button" value="3" onclick="addInput(3)" /></td>
<td><input type="button" value="+" class="operator" onclick="add()" /></td>
</tr>
<tr>
<td><input type="button" value="4" onclick="addInput(4)" /></td>
<td><input type="button" value="5" onclick="addInput(5)" /></td>
<td><input type="button" value="6" onclick="addInput(6)" /></td>
<td><input type="button" value=" - " onclick="sub()" class="operator" /></td>
</tr>
<tr>
<td><input type="button" value="7" onclick="addInput(7)" /></td>
<td><input type="button" value="8" onclick="addInput(8)" /></td>
<td><input type="button" value="9" onclick="addInput(9)" /></td>
<td><input type="button" value=" * " onclick="mult()" class="operator" /></td>
</tr>
<tr>
<td><input type="button" value=" c " onclick="clr()" class="clear" /></td>
<td><input type="button" value="0" onclick="addInput(0)" /></td>
<td><input type="button" value=" = " onclick="calculate()" class="eval" /></td>
<td><input type="button" value=" / " onclick="div()" class="operator" /></td></td>
</tr>
</table>
</body>
<script>
"use strict";
var a, b, c;
var operator;
function getValue(value) {
var res = parseInt(document.getElementById(value).value);
if (res == res)
return res;
}
function addInput(val) {
document.getElementById("screen").value = document.getElementById("screen").value + val;
document.getElementById("action").value = document.getElementById("action").value + val;
}
function add() {
a = getValue("screen");
document.getElementById("action").value = document.getElementById("action").value + "+";
document.getElementById("screen").value = "";
operator = "+";
}
function sub() {
a = getValue("screen");
document.getElementById("action").value = document.getElementById("action").value + "-";
document.getElementById("screen").value = "";
operator = "-";
}
function mult() {
a = getValue("screen");
document.getElementById("action").value = document.getElementById("action").value + "*";
document.getElementById("screen").value = "";
operator = "*";
}
function div() {
a = getValue("screen");
document.getElementById("action").value = document.getElementById("action").value + "/";
document.getElementById("screen").value = "";
operator = "/";
}
function clr() {
document.getElementById("action").value = "";
document.getElementById("screen").value = "";
}
function calculate() {
b = getValue("screen");
switch (operator) {
case "+":
c = a + b;
break;
case "-":
c = a - b;
break;
case "*":
c = a * b;
break;
case "/":
if (b == 0) {
alert('Division durch Null kann nicht sein!');
}
else {
c = a / b;
}
break;
}
document.getElementById("screen").value = c;
document.getElementById("action").value = document.getElementById("action").value + "=" + c;
}
</script>
</html>