javascript 公式有多个参数时无法获得正确的输出

o2gm4chl  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(91)

赋值语句需要一个能理解平方数的计算器。为了简化表示法,平方数表示为X ^,其中X是要求平方的数。整个过程接受多个等式。例如,如果用户输入:
5 ^; 1000 + 6 ^-5 ^+1;
预计返回人数为二十五一千零十二人。
这是我的想法

function calculate() {
        let input = document.getElementById("input").value;
        let expressions = input.split(";").filter(Boolean); // Split input into expressions
        let output = "";
        for (let expr of expressions) { // Iterate over expressions
            let tokens = expr.split(/(\+|\-|\*|\/|\^)/g).filter(Boolean); // Split expression into tokens (numbers and operators)
            let result = parseInt(tokens[0]); // Initialize result to the first number
            let operator = null;
            for (let i = 1; i < tokens.length; i += 2) { // Iterate over operators
                if (tokens[i] === "^" && tokens[i + 1] === "") {
                    result = Math.pow(result, 2);
                    continue; // Skip to next iteration
                } else if (tokens[i].match(/[\+\-\*\/\^]/)) {
                    operator = tokens[i]; // Otherwise, it's a regular operator
                }
                if (operator === "^") {
                    result = Math.pow(result, 2);
                    } else if (operator === "+") {
                        result += parseInt(tokens[i + 1]);
                    } else if (operator === "-") {
                        result -= parseInt(tokens[i + 1]);
                    } else if (operator === "*") {
                        result *= parseInt(tokens[i + 1]);
                    } else if (operator === "/") {
                        result /= parseInt(tokens[i + 1]);
                    }
                }
                output += result + "<br>"; // Append result to output with a line break
            }
            document.getElementById("result").innerHTML = output; // Display output
        }

就目前情况而言,前两个方程的输出为:25 1024206744962
任何帮助将不胜感激。
5 ^; 1000 + 6 ^-5 ^+1;
预计返回25 1012
但是,它正在返回25 1024206744962
从其他地方告诉我的,作为一个开始,我的输出被初始化为一个字符串而不是一个数字,因此疯狂的输出。我似乎不能得到足够的调整来纠正它。

8hhllhi2

8hhllhi21#

你的数学表达式遇到了运算顺序的问题,要制作这种数学解析器,你需要考虑2 + 3 * 4 = 14(2 + 3) * 4 = 20之间的差异。
我建议这样实现:

const expandSquares = (input) => {
    return input.replaceAll(/(?<number>\d+)\^/g, '$1 * $1');
};

const doMultiplicationAndDivision = (input) => {
    // TODO
};

const doAdditionAndSubtraction = (input) => {
    // TODO
};

const calculateOne = (input) => {
    return doAdditionAndSubtraction(
        doMultiplicationAndDivision(expandSquares(input)),
    );
};

const calculateAll = (input) => {
    return input.split(';').map((expression) => {
        return calculateOne(expression);
    });
};

这个想法是你多次循环你的输入令牌,只处理某些运算。如果你想要正确的数学,你必须在看加法和减法之前处理乘法和除法。

相关问题