数学表达式解析计算

  最近在做一个项目,但是在项目运算的过程中遇到一个问题,需求方在进行相关参数运算时,

需要根据系统总已有的计算公式(加减乘除、对数函数、幂指函数等)进行运算:比如下面的公式

ln(B) = a + b * ln(c^2*d),起初的思路是对每个表达式写一个对应计算函数,在运算时候只需要

根据用户的选择选择重载的函数即可,即不需要对函数表达式进行存储。

   但是需求方还有一个需求,就是用户可以根据自己的实际情况进行公式的自定义。于是一个公式

对应一个函数的思路算是不能实施了,最好是有一款符合四则运算并支持常见函数的工具包,如下:

   JEP是Java expression parser的简称,即java表达式分析器,Jep是一个用来转换和计算数学表达式

的java库。通过这个程序包,用户可以以字符串的形式输入一个、任意的公式,然后快速地计算出

结果。Jep支持用户自定义变量、常量和函数。

网址:http://www.singularsys.com/jep/

   因为网上示例比较少,大多只是对加减乘除的运算:自己根据以往经验写了一小示例希望对大家起到

抛砖引玉的作用:

package org.mino.jep;

import com.singularsys.jep.Jep;
import com.singularsys.jep.JepException;

public class SimpleExample {
	public static void main(String[] args) throws JepException {
		Jep jep = new Jep(); //一个数学表达式
/*		String exp = "((a+b)*(c+b))/(c+a)/b"; // 给变量赋值
		jep.addVariable("a", 10);
		jep.addVariable("b", 10);
		jep.addVariable("c", 10);
*/
////	String exp = "log (b)";
//		String exp = "pow(a,b)";
//		jep.addVariable("a", 10);
//		jep.addVariable("b" , 10);
		
		//String exp = "ln(b)";
//		jep.addVariable("b", 8);
		
		String exp = "r = a+b*ln(pow(c,2)*d)";//運算結束后需要在進行pow根據公式
		jep.addVariable("a", 1);
		jep.addVariable("b", 2);
		jep.addVariable("c", 3);
		jep.addVariable("d", 4);
		try { // 执行
			jep.parse(exp);
			Object result = jep.evaluate();
			System.out.println("计算结果: " + result);
			System.out.println(jep.getVariableValue("r"));
		} catch (JepException e) {
			System.out.println("An error occured: " + e.getMessage());
		}
	}
}

 PS:1、"r = a+b*ln(pow(c,2)*d)" 可以运算但"ln(r) = a+b*ln(pow(c,2)*d)"不可以运算;2、函数运算地方一定使用"()",会识别ln(a)但能识别lna;3、尽量多使用"()"避免产生歧义。附件为工具包

猜你喜欢

转载自lovezehui.iteye.com/blog/2059082
今日推荐