`

数学表达式解析计算

阅读更多

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

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

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、尽量多使用"()"避免产生歧义。附件为工具包

分享到:
评论

相关推荐

    Go-使用Go实现的数学表达式解析计算引擎

    使用 Go 实现的数学表达式微型计算引擎,无任何依赖,相对比较完整的完成了数学表达式解析执行,包括词法分析、语法分析、构建AST、运行。

    math-engine:数学表达式解析和计算引擎库。数学表达式解析计算引擎库

    使用Go实现的数学表达式解析计算引擎库,它小巧,无任何依赖,具有扩展性(可以将自己的函数到引擎中),比较完整的完成了数学表达式解析执行,包括词法分析,语法分析,构建AST,运行。 go get -u github....

    Java 数学表达式解析器

    可以支持复杂的数学表达式(常量、变量、带括号)的计算 如123 + (a * 456)/c - (d + 789) 输入变量值,展示计算步骤和结果 目前支持+ - * / 幂 cos等操作 操作符可方便扩展

    一个基于纯js实现的数学表达式客户端计算及解析的程序源码

    一个基于纯js实现的数学表达式客户端计算及解析的程序源码。

    C++支持的表达式解析

    使用boost::sprirt编写的表达式解析器,代码很容易扩展,功能很强大,适合做功能强大的客户化定义程序。 -----------表达式解析--------- 已定义的函数有:PI,SIN,COS,TAN,,ABS,EXP,LOGN,POW,SQRT,FORMAT,LENGTH,...

    表达式解析引擎(支持等式表达式,不等式表达式,与或非逻辑运算表达式,支持带参数和带函数的表达式解析),可以在电脑,单片及上运行

    C语言版的等式表达式解析,不等式表达式解析,与或非逻辑运算表达式解析;支持带参数的表达式解析; 支持带函数的表达式解析。 1、支持 +、-、*、/、%、&&、||、!、>、<、>=、、==、!=、^(幂)、(、) 运算符 2、支持...

    数学表达式计算c++

    c++ 实现数学表达式计算 支持 常见的数学函数。如sin cos sqrt abs ... 支持 大多数运算符。 使用良好的设计模式,易于维护和拓展。

    calculator:Javascript的数学表达式解析器

    计算器Javascript的数学表达式解析器。 可在微信小程序中使用支持IE9 + 支持AMD / CommonJS 支持定制运营商支持自定义功能您可以使用util将数学表达式解析为反向波兰表示法或对其求值。例如,当解析1+2*3 ,您将获得...

    c++数学表达式计算

    c++ 实现数学表达式计算 支持 常见的数学函数。如sin cos sqrt abs ... 支持 大多数运算符。 使用良好的设计模式,易于维护和拓展。

    java字符串数学表达式(含括号)计算值

    代码均为自己设计所写,分享一下。 字符串数学表达式(含括号)计算值 如: "31+3*3-20/2*5+40/8+4*5" ((2*(19-13*(1+2)/39)/6+4)-5)/5+((2+3)*2-5)

    利用Java动态编译计算数学表达式

    前几天要做一个计算数学表达式的题目,本来计划使用解析表达式的方法来解析各种数学表达式,然后再动态计算表达式的值.后来考虑到这样编程的任务很重,时间有限 后来在网上搜搜,看到使用动态编译并使用反射机制 ,这样...

    字符串类型的数学表达式 不用解析 直接得出结果

    字符串类型的数学表达式 不用解析 直接得出结果 public class IllegalExpressionException extends RuntimeException { private static final long serialVersionUID = 7941685726759058059L; public ...

    c++ 数学表达式

    这是用C++语言写的对输入的正确的字符串 数学表达式的求解过程,在vc 6.0下能得出正确的结果,并且可以处理括号,希望对大家有所帮助

    实用数学工具企业版(可以计算超复杂的数学表达式)

    2.可以作为大型的计算器,本工具可以计算超复杂的数学表达式! 如:lg(1+2*5+2-|1-10|)+cos(tg(0.1))+3!=8.0778 3.完全符合数学简写习惯,大大加快了输入速度! 如5*x可简写为5x,2*sin(x)可简写为2sin(x) 4.多达20...

    boost::spirit解析表达式domo

    C++实现的表达式解析,本程序是利用强大的boost::spirit库实现的。这个东西实在是太强大了。 程序运行结果如下: -----------表达式解析--------- 已定义的函数有:PI,SIN,COS,TAN,,ABS,EXP,LOGN,POW,SQRT,FORMAT,...

    mep4j:数学表达式解析器4 Java-开源

    数学表达式解析器4 Java MEP4J是用于Java的高性能数学表达式字符串解析器(J2SE> = 5)。 将其与同类库的性能进行比较,并让我知道您的经验。 该库管理5个运算符(+,-,/,%,*)以及以下功能:-“ abs”-“ cos”...

    C#数学运算表达式解释器源码

    C#数学运算表达式解释器,参考:http://blog.csdn.net/testcs_dn/article/details/37776937

    meval-一个简单的数学表达式解析器和评估器-Rust开发

    meval这个Rust板条箱提供了简单的数学表达式解析和评估。 它的主要目标是使用方便,同时允许一些灵活的操作。该Rust板条箱提供了简单的数学表达式解析和评估。 其主要目标是使用方便,同时具有一定的灵活性。 当前仅...

    表达式解析器 IKExpression

    同EL和BeanScript不同,IK Expression的设计目标是面向最终用户的,因此它被设计成语法简单(像数学算式),通俗易懂(支持中文变量及函数名)但功能有限的解析引擎。如果你需要一个功能强大的表达式引擎,也许IK ...

    go-math-expression-parser:简单的数学表达式解析器

    简单的数学表达式解析器 该解析器可以与+, -, *, /, ^, %运算符,括号一起使用,并且对空格不敏感 s1 := "x * (y%3)" s2 := "x1^(-1)" s3 := "(price - purchasePrice) * numOfGoods * 0.87" 要解析表达式,请调用...

Global site tag (gtag.js) - Google Analytics