我正在写一个单行计算器,它具有基本功能(+ - * /)。我以前做过这个,但现在我一直得到错误的答案,我找不到我的错误。这是我的代码:
var seq = document.getElementById('sequence').value;
var allNums = [];
var i = 0, allSigns = [];
var currentNums = "";
for (i = 0; i< seq.length; i++)
{
if (seq[i] != "+" && seq[i] != "-" && seq[i] != "*" && seq[i] != "/")
{
currentNums+=seq[i];
}
else
{
allNums.push(Number(currentNums));
currentNums="";
allSigns.push(seq[i]);
}
}
allNums.push(Number(currentNums));
var result = 0;
for (i = 0; i < allNums.length; i++)
{
if (allSigns[i] == '+')
result+=Number(allNums[i]);
else if (allSigns[i] == "-")
result-=Number(allNums[i]);
else if (allSigns[i] == "*")
result*=Number(allNums[i]);
else if (allSigns[i] == "/")
result/=parseInt(allNums[i]);
else
{
alert("The result is: " + result);
break;
}
}
所有这些代码都在一个名为calculate的函数中。 func由按钮触发,序列来自输入。
答案 0 :(得分:1)
虽然这个简单的计算器存在许多缺点,可能会或可能不是一个问题(取决于你想用它做什么),但有一个问题是你的allSigns
数组值没有与之关联正确的allNums
数组值。
看看this example。在控制台中,您可以看到与6
关联的符号是加号,而与2
关联的运算符未定义。当然,这不是我们想要的。我们想要的是将这两个添加到六个。
此问题的解决方法是始终将allNums[0]
添加到result
。这将我们的结果设置为跟随它的任何操作。在这种情况下,我们从6
开始。
接下来我们需要做的是将allSigns
的每个值的位置向下移动,在之后将运算符与值对齐,而不是之前的 / em>它。因此,在上面的示例中,我们将+
与2
相关联,因此它会将两者添加到六个中。
This JSFiddle显示了针对此特定情况的修复程序。
答案 1 :(得分:0)
http://jsbin.com/obasix/3/edit
没有数字那么多的迹象。因此,如果有2个数字和1个符号,它将计算5 +然后结束。
你应该从结果开始带上第一个数字。
然后迭代剩余的数字并相应地计算。
var seq = "5+4";
var allNums = [];
var i = 0, allSigns = [];
var currentNums = "";
for (i = 0; i< seq.length; i++)
{
if (seq[i] != "+" && seq[i] != "-" && seq[i] != "*" && seq[i] != "/")
{
currentNums+=seq[i];
}
else
{
allNums.push(Number(currentNums));
currentNums="";
allSigns.push(seq[i]);
}
}
allNums.push(Number(currentNums));
var result = allNums[0];
for (i = 1; i <= allNums.length; i++)
{
if (allSigns[i-1] == '+')
result+=Number(allNums[i]);
else if (allSigns[i-1] == "-")
result-=Number(allNums[i]);
else if (allSigns[i-1] == "*")
result*=Number(allNums[i]);
else if (allSigns[i-1] == "/")
result/=parseInt(allNums[i]);
else
{
alert("The result is: " + result);
break;
}
}