Java实现四则运算表达式计算

本文提供了一个用于计算四则运算表达式的Java程序,详细解释了如何解析并计算包含括号和基本运算符的数学表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * 四则运算表达式计算
 * @author penli
 *
 */
public class Arithmetic {
	public static void main(String args[]){
		System.out.println(arithmetic("2.2+((3+4)*2-22)/2*3.2"));
	}
	public static double arithmetic(String exp){
		String result = parseExp(exp).replaceAll("[\\[\\]]", "");
		return Double.parseDouble(result);
	}
	/**
	 * 解析计算四则运算表达式,例:2+((3+4)*2-22)/2*3
	 * @param expression
	 * @return
	 */
	public static String parseExp(String expression){
		//String numberReg="^((?!0)\\d+(\\.\\d+(?<!0))?)|(0\\.\\d+(?<!0))$";
		expression=expression.replaceAll("\\s+", "").replaceAll("^\\((.+)\\)$", "$1");
		String checkExp="\\d";
		String minExp="^((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))$";
		//最小表达式计算
		if(expression.matches(minExp)){
			String result=calculate(expression);
			
			return Double.parseDouble(result)>=0?result:"["+result+"]";
		}
		//计算不带括号的四则运算
		String noParentheses="^[^\\(\\)]+$";
		String priorOperatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
		String operatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
		if(expression.matches(noParentheses)){
			Pattern patt=Pattern.compile(priorOperatorExp);
			Matcher mat=patt.matcher(expression);
			if(mat.find()){
				String tempMinExp=mat.group();
				expression=expression.replaceFirst(priorOperatorExp, parseExp(tempMinExp));
			}else{
				patt=Pattern.compile(operatorExp);
				mat=patt.matcher(expression);
				
				if(mat.find()){
					String tempMinExp=mat.group();
					expression=expression.replaceFirst(operatorExp, parseExp(tempMinExp));
				}
			}
			return parseExp(expression);
		}
		//计算带括号的四则运算
		String minParentheses="\\([^\\(\\)]+\\)";
		Pattern patt=Pattern.compile(minParentheses);
		Matcher mat=patt.matcher(expression);
		if(mat.find()){
			String tempMinExp=mat.group();
			expression=expression.replaceFirst(minParentheses, parseExp(tempMinExp));
		}
		return parseExp(expression);
	}
	/**
	 * 计算最小单位四则运算表达式(两个数字)
	 * @param exp
	 * @return
	 */
	public static String calculate(String exp){
		exp=exp.replaceAll("[\\[\\]]", "");
		String number[]=exp.replaceFirst("(\\d)[\\+\\-\\*\\/]", "$1,").split(",");
		BigDecimal number1=new BigDecimal(number[0]);
		BigDecimal number2=new BigDecimal(number[1]);
		BigDecimal result=null;
		
		String operator=exp.replaceFirst("^.*\\d([\\+\\-\\*\\/]).+$", "$1");
		if("+".equals(operator)){
			result=number1.add(number2);
		}else if("-".equals(operator)){
			result=number1.subtract(number2);
		}else if("*".equals(operator)){
			result=number1.multiply(number2);
		}else if("/".equals(operator)){
			result=number1.divide(number2);
		}
		
		return result!=null?result.toString():null;
	}
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值