计算器未正确遵循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
相关产品推荐
相关产品推荐

