`
yangzc106
  • 浏览: 156714 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 实现的公式计算

 
阅读更多

发个我写的计算公式代码:

 

package org.yangzc.math;

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

/**
 * 数据计算公式
 * @author yangzc
 *
 */
public class MathEval {

	public static char PLUS = '+';
	public static char MINUS = '-';
	public static char MULTI = '*';
	public static char DEVIDE = '/';
	
	public static char BRACKET_LEFT = '(';
	public static char BRACKET_RIGHT = ')';
	
	/**
	 * 计算带小括号的公式
	 * @param line
	 * @return
	 */
	public static double eval(String line){
		while(line.indexOf(BRACKET_LEFT) != -1){
			Pattern pattern = Pattern.compile("\\(([^\\(\\)]*?)\\)");
			Matcher matcher = pattern.matcher(line);
			while(matcher.find()){
				double result = simpleEval(matcher.group(1));
				line = line.replace(matcher.group(), result+"");
			}
		}
		return simpleEval(line);
	}
	
	/**
	 * 计算不带括号的公式
	 * @param line
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static double simpleEval(String line){
		Stack<Double> valueStack = new Stack<Double>();//保存值的堆栈
		Stack<Character> markStack = new Stack<Character>();//保存符号的堆栈
		
		char ch[] = line.toCharArray();
		
		//计算乘除操作
		String tmpValue = "";
		boolean isOper = false;
		for(int i=0; i< ch.length; i++){
			if( ch[i] == PLUS || ch[i] == MINUS || ch[i] == MULTI || ch[i] == DEVIDE) {
				double dv = Double.valueOf(tmpValue).doubleValue();
				if(isOper){
					double dv1 = valueStack.pop();
					char op = markStack.pop();
					double result = simpleTwoEval(op, dv1, dv);
					dv = result;
				}
				valueStack.push(dv);
				markStack.push(ch[i]);
				tmpValue = "";
				isOper = false;
				if( ch[i] == MULTI || ch[i] == DEVIDE )
					isOper = true;
			}else{
				tmpValue += ch[i] + "";
				
				if(i == ch.length -1){
					double dv = Double.valueOf(tmpValue).doubleValue();
					if(isOper){
						double dv1 = valueStack.pop();
						char op = markStack.pop();
						double result = simpleTwoEval(op, dv1, dv);
						dv = result;
					}
					valueStack.push(dv);
				}
			}
		}
//		for(int i=0; i< valueStack.size(); i++){
//			System.out.println(valueStack.get(i));
//		}
//		for(int i=0; i< markStack.size(); i++){
//			System.out.println(markStack.get(i));
//		}
		
		//计算加减操作
		valueStack = (Stack<Double>) reverseStack(valueStack);
		markStack = (Stack<Character>) reverseStack(markStack);
		while(valueStack.size() > 1){
			double v1 = valueStack.pop();
			double v2 = valueStack.pop();
			char op = markStack.pop();
			double result = simpleTwoEval(op, v1, v2);
			valueStack.push(result);
		}
		return valueStack.get(0);
	}
	
	/**
	 * 把整个堆栈翻转
	 * @param stack
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private static Stack<?> reverseStack(Stack<?> stack){
		Stack reverse = new Stack();
		int stackSize = stack.size();
		for(int i=0; i< stackSize; i++){
			reverse.push(stack.pop());
		}
		return reverse;
	}
	
	/**
	 * 只计算简单的两个数结果
	 * @param op
	 * @param value1
	 * @param value2
	 * @return
	 */
	private static double simpleTwoEval(char op, double value1, double value2){
		if(op == PLUS){
			return value1 + value2;
		}else if(op == MINUS){
			return value1 - value2;
		}else if(op == MULTI){
			return value1 * value2;
		}else if(op == DEVIDE){
			return value1 / value2;
		}
		return 0;
	}
	
	public static void main(String[] args) {
		double result = MathEval.eval("1+(2*(3+2))-6+(3/2)+4/2");
		System.out.println();
		System.out.println(result);
	}
}
 
分享到:
评论
2 楼 cys1314 2015-04-07  
     
1 楼 h248980496 2012-09-13  
double做乘法除法不靠谱啊,而且只能数值做计算,不能代数,不过写的不错哦

相关推荐

    java 公式计算汇总,直接调用其方法即可进行运算

    在Java编程语言中,公式计算是一项常见的需求,特别是在科学计算、数据分析、数学建模等领域。为了简化这方面的代码编写,开发者经常会将各种计算操作封装成方法,以便在项目中直接调用。标题“java 公式计算汇总,...

    java实现eval函数

    然而,如果你提供的压缩包"java实现eval函数"包含的是一个Java项目,那么它很可能是实现了类似功能的自定义解决方案,可能是一个解析器或者编译器,用于处理特定的表达式或脚本语法。这个项目可能包括以下几个部分:...

    java实现复合辛普森求积公式

    本程序使用java实现复合辛普森求积公式,使用者可自行修改求积函数

    相似度计算公式(皮尔森pearson和余弦)的Java实现

    使用Java 语言,实现了皮尔森和余弦相似度公式,供大家参考。

    java 公式解析源码

    `src`目录则是源代码所在的地方,我们可以在这里找到实现公式解析的核心类。这些类可能包括一个解析器类,它使用某种解析策略(如递归下降解析、LL解析或LR解析),以及一个求值器类,它负责执行解析后的AST。源码...

    数值计算方法--插值函数(java实现)

    数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) 数值计算方法--插值函数(java实现) ...

    字符串计算公式计算

    Java提供了丰富的API和工具来帮助开发者实现这一功能,但具体实现方式取决于计算公式的复杂程度和项目需求。通过学习和实践,我们可以掌握这项技能,从而在实际工作中高效地处理各种字符串计算任务。

    曲线拟合计算(java实现)

    在这个项目中,作者使用Java实现了曲线和直线的拟合功能。 在Java中,曲线拟合通常涉及到数值分析和线性代数的知识。首先,我们需要理解数据点的坐标,这些点可以表示为`(x, y)`对,其中`x`是自变量,`y`是因变量。...

    JAVA数学计算包

    《JAVA数学计算包:Apache Commons Math3库的深度解析》 在Java编程环境中,进行复杂的数学计算和统计分析是一项常见的任务。Apache Commons Math3库,作为JAVA数学计算包,为开发者提供了强大的工具,使得在Java中...

    java 请假天数计算工具类

    在实现上,可以创建一个`LeaveDaysCalculator`类,包含计算请假天数的方法,如`calculateLeaveDays(Date startDate, Date endDate)`。使用Java 8的日期时间API(`java.time`包)来处理日期和时间,如计算两个日期...

    java实现二十四节气计算

    在Java编程语言中实现二十四节气的计算是一项有趣且实用的任务。二十四节气是中国传统历法的重要组成部分,它反映了地球在公转轨道上的位置变化,与农业生产、气候、民俗活动等紧密相关。以下是对这个话题的详细阐述...

    java实现七参数转换功能

    总之,Java实现七参数转换功能涉及到坐标转换理论、数学运算和编程技巧,通过"SevenParamsDemo"这样的实践项目,开发者可以深入理解并应用这一技术。在实际工作中,这样的转换功能对于地理信息系统的精度和实用性至...

    java实现 根据经纬度算距离

    通过经纬度算出两点间的距离,经过仔细对比及参照,相对精确度较高,请大家放心使用

    计算汉字笔画数java实现

    ### Java实现的关键点 #### 1. 字符串处理 在Java中,可以通过`toCharArray()`方法将字符串转换为字符数组,以便逐个字符地进行处理。例如: ```java char[] chars = cnStr.toCharArray(); ``` 这里`cnStr`代表待...

    Java生成excel表格设置公式并填充数据

    Java编程调用PageOffice实现从空白的excel文件动态生成excel表格,设置公式并填充数据。 集成PageOffice不但能够实现在线编辑、保存真正的Office文档,而且还可以轻松实现Word、Excel文档的动态数据填充、格式控制和...

    java解析公式 eval.jar

    这些函数可以增强公式计算的复杂性。 4. **变量绑定**:在解析公式时,可以将程序中的变量绑定到公式中,使得公式能够引用程序状态。这对于基于当前数据进行计算非常方便。 5. **安全性和错误处理**:在使用`eval....

    使用JAVA实现Entropy(信息熵)计算代码

    在信息论中,熵(Entropy)是一个非常重要的概念,...通过理解和应用这些知识点,你可以使用JAVA实现信息熵的计算,从而更好地分析数据的特性。这在数据压缩算法设计、编码理论以及各种信息处理场景中都具有实际价值。

    JAVA实现MFCC算法MFCC+FFT

    总的来说,MFCC+FFT的JAVA实现涉及到信号处理、数字音频和数值计算等多个领域的知识,是语音识别系统的基础模块。开发者需要深入理解这些概念,并结合JAVA编程技术,才能构建出高效可靠的MFCC算法。

    java实现logistic回归算法

    综上所述,Java实现Logistic回归涉及了数据处理、模型构建、优化算法等多个方面,需要对机器学习基础理论和Java编程有一定了解。在实际项目中,我们通常会结合现有的库来简化开发过程,并注重模型的评估和调优。

    JAVA计算微积分源代码

    某天,突发奇想,有没有计算微积分的程序 找了半天,发现一些如 matlab 、《计算工厂》等软件, 就是没找到,能够以字符串形式输入表示式 并且能够方便JAVA调用的程序 于是花了3天做了一个

Global site tag (gtag.js) - Google Analytics