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

计算器未正确遵循BODMAS规则问题求助(附Java代码)

解决BODMAS计算器优先级问题

嘿,我注意到你写的BODMAS计算器没按预期执行规则,咱们来一步步梳理问题并搞定它~

首先看你给出的代码片段,eval方法的完整实现没贴出来,但这类问题最常见的原因是直接从左到右计算所有运算,没有按照BODMAS的优先级分层处理。BODMAS的执行顺序是:括号(Brackets)> 幂次(Orders)> 乘除(Multiplication & Division)> 加减(Addition & Subtraction),同一优先级的运算从左到右执行。

修复方案:分层处理优先级

我给你一个完整的eval方法实现,严格遵循BODMAS规则:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Calculator {
    String expression;

    public Calculator(String expr) {
        this.expression = expr.replaceAll("\\s+", "");
    }

    public double evalExpr() {
        return eval(expression);
    }

    private double eval(String input) {
        // 第一步:处理括号(递归计算括号内的子表达式)
        Pattern bracketPattern = Pattern.compile("\\(([^()]*)\\)");
        Matcher matcher = bracketPattern.matcher(input);
        while (matcher.find()) {
            String subExpr = matcher.group(1);
            double subResult = eval(subExpr);
            // 替换括号内的内容为计算结果
            input = input.replace("(" + subExpr + ")", String.valueOf(subResult));
            matcher = bracketPattern.matcher(input);
        }

        // 第二步:处理乘除运算(同一优先级,从左到右)
        Pattern mulDivPattern = Pattern.compile("(-?\\d+\\.?\\d*)([*/])(-?\\d+\\.?\\d*)");
        matcher = mulDivPattern.matcher(input);
        while (matcher.find()) {
            double num1 = Double.parseDouble(matcher.group(1));
            char operator = matcher.group(2).charAt(0);
            double num2 = Double.parseDouble(matcher.group(3));
            double result = operator == '*' ? num1 * num2 : num1 / num2;
            // 替换当前乘除运算为结果
            input = input.replace(matcher.group(0), String.valueOf(result));
            matcher = mulDivPattern.matcher(input);
        }

        // 第三步:处理加减运算(同一优先级,从左到右)
        Pattern addSubPattern = Pattern.compile("(-?\\d+\\.?\\d*)([+-])(-?\\d+\\.?\\d*)");
        matcher = addSubPattern.matcher(input);
        while (matcher.find()) {
            double num1 = Double.parseDouble(matcher.group(1));
            char operator = matcher.group(2).charAt(0);
            double num2 = Double.parseDouble(matcher.group(3));
            double result = operator == '+' ? num1 + num2 : num1 - num2;
            // 替换当前加减运算为结果
            input = input.replace(matcher.group(0), String.valueOf(result));
            matcher = addSubPattern.matcher(input);
        }

        // 最终剩下的就是结果
        return Double.parseDouble(input);
    }
}

关键逻辑说明

  • 括号处理:用正则匹配括号内的子表达式,递归调用eval计算结果,再替换回原表达式,确保括号内的运算优先执行。
  • 乘除优先:先处理所有乘除运算,因为它们的优先级高于加减,每次计算一个乘除项后替换,直到没有乘除运算为止。
  • 加减最后:最后处理加减运算,同样从左到右依次计算。

测试示例

比如输入"3 + 4 * 2",按照BODMAS应该得到11,而不是14;输入"(5 + 3) * 2"会得到16,这个实现都能正确处理。

内容的提问来源于stack exchange,提问作者Andy Orchard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:47:53