JS计算器问题。错误的答案

时间:2013-05-06 19:22:55

标签: javascript html

我正在写一个单行计算器,它具有基本功能(+ - * /)。我以前做过这个,但现在我一直得到错误的答案,我找不到我的错误。这是我的代码:

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由按钮触发,序列来自输入。

2 个答案:

答案 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;
    }
}