2

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

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

4

3 回答 3

1

虽然这个简单的计算器有许多缺点,可能有问题也可能没有问题(取决于你想用它做什么),一个问题是你的allSigns数组值没有与正确的allNums数组值相关联。

看看这个例子。在控制台中,您可以看到与 关联的符号6是加号,而与 关联的运算符2是未定义的。当然,这不是我们想要的。我们想要的是把两个加到六个上。

这个问题的修复总是从一开始就添加allNums[0]result。这将我们的结果设置为可以被它后面的任何东西操作。在这种情况下,我们从 开始6

接下来我们需要做的是将每个值的位置allSigns向下移动一个,将运算符与它之后的值对齐,而不是它之前的值。因此,在上面的示例中,我们+与 关联2,因此它将两个添加到六个。

此 JSFiddle显示了针对此特定情况的修复。

于 2013-05-06T19:31:02.847 回答
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;
    }
}
于 2013-05-06T19:34:40.763 回答
0

试试这个库https://github.com/notshekhar/calculate.js

例子

<script src="https://raw.githubusercontent.com/notshekhar/calculate.js/main/calculate.js"></script>
<script>
  let add = calculate(1, 1, "+") // add -> 2
  let sub = calculate(1, 1, "-") // sub -> 0
  let mul = calculate(1, 1, "*") // mul -> 1
  let div = calculate(1, 1, "/") // div -> 1
  let mod = calculate(1, 1, "%") // mod -> 0
</script>
于 2022-01-11T15:47:14.903 回答