You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何计算含运算符、百分号、括号的数学表达式,exp4j括号场景失效

Java 含括号、百分号的数学表达式计算问题

我需要计算包含算术运算符、百分号和括号的数学表达式。

示例:expressionString = 200+10%+(50+100%)%,预期输出结果为440。

我当前使用exp4j库处理数学表达式,该库遵循BODMAS规则计算,但没有内置百分号运算支持,因此我需要自行实现相关逻辑,尝试的代码如下:

Expression expression;
String newExpr = "", exprResult = "";
String[] ar;
if (calHelper.containsScientific(expressionString)) {
    ar = expressionString.split("(?<=[-+])|(?=[-+])");  //按运算符拆分表达式
} else {
    ar = expressionString.split("(?<=[-+()])|(?=[-+()])"); //按运算符拆分表达式
    //ar = expressionString.split("(?<=[-+])|(?=[-+])"); //按运算符拆分表达式
}

for (int i = 0; i < ar.length; i++) {
    System.out.println("exp: "+ar[i]);
    try {
        if (ar[i].indexOf('%') < 0) {
            newExpr += ar[i];
            expression = evaluateExpression(newExpr, radDeg.getText().toString());
            ValidationResult res = expression.validate();
            if (res.isValid()) {
                double result = expression.evaluate();
                exprResult = calHelper.withNoTrailingZeros(result);
                newExpr = exprResult;
            }
        } else {
            //如果表达式中有百分数的加减运算,则基于已计算的结果算百分比,其他运算符取1%值即数值/100
            //如果%后没有第二个操作数,则不做额外计算,按exp4j原有逻辑处理
            int preIndex = i - 1, nextIndex = i + 1;
            String prevOp, nextOp;
            prevOp = preIndex > -1 ? ar[preIndex] : "";
            nextOp = nextIndex < ar.length ? ar[nextIndex] : "";
            String perNo = ar[i].replace("%", "");

            if (!exprResult.isEmpty() && calHelper.isNumeric(perNo) &&
                    calHelper.percentNoSecondOperand(ar[i]) &&
                    calHelper.allowPercentCal(prevOp, nextOp)) {
                newExpr += exprResult + '%' + perNo;
                expression = evaluateExpression(newExpr, radDeg.getText().toString());
                ValidationResult res = expression.validate();
                if (res.isValid()) {
                    double result = expression.evaluate();
                    newExpr = calHelper.withNoTrailingZeros(result);
                    exprResult = newExpr;
                }
            } else if (calHelper.percentNoSecondOperand(ar[i]) &&
                    calHelper.allowOnePercentCal(perNo, prevOp, nextOp)) {
                newExpr += ar[i].replaceAll("%", "%1");
                expression = evaluateExpression(newExpr, radDeg.getText().toString());
                ValidationResult res = expression.validate();
                if (res.isValid()) {
                    double result = expression.evaluate();
                    newExpr = calHelper.withNoTrailingZeros(result);
                    exprResult = newExpr;
                }
            } else {
                newExpr += ar[i];
                expression = evaluateExpression(newExpr, radDeg.getText().toString());
                ValidationResult res = expression.validate();
                if (res.isValid()) {
                    double result = expression.evaluate();
                    newExpr = calHelper.withNoTrailingZeros(result);
                    exprResult = newExpr;
                }

            }

        }
    } catch (Exception e) {
        e.getStackTrace();
    }
}

上述代码在表达式不含括号时可正常计算百分号,但表达式包含括号时会计算失败。

请问是否有Java库可以支持处理包含标准运算符、括号、百分号运算符任意组合的表达式?


内容的提问来源于stack exchange,提问作者deepak kulkarni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:15:04