2.X 存在精确度问题 推荐使用3.X 参考文章: java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算)
1.增加jep依赖
<dependency><groupId>org.scijava</groupId><artifactId>jep</artifactId><version>2.4.2</version></dependency>
2.计算公式
JEP本身支持的函数 如果没有需要的函数 下文有自定义函数实现
计算 M12*3.14/4*pow(O5,2)*(K11+273-G11)/(G12*sqrt(3.14*M11*P11)) 的值 够复杂吧
public static void main(String[] args) {JEP jep = new JEP();// 添加常用函数jep.addStandardFunctions();// 添加常用常量jep.addStandardConstants();String exp = "M12*3.14/4*pow(O5,2)*(K11+273-G11)/(G12*sqrt(3.14*M11*P11))"; //给变量赋值jep.addVariable("M12", 1.1);jep.addVariable("O5", 11.28665296);jep.addVariable("K11", 25);jep.addVariable("G11", 200);jep.addVariable("G12", 100000);jep.addVariable("M11", 0.000000129);jep.addVariable("P11", 10);try { //执行jep.parseExpression(exp);double result = jep.getValue();System.out.println("计算结果: " + result);} catch (Throwable e) {System.out.println("An error occured: " + e.getMessage());}}
完全不是问题
3.实现自定义函数 min max
min函数 两数取最小值
public class Min extends PostfixMathCommand {public Min() {super();// 使用参数的数量numberOfParameters = 2;}@Overridepublic void run(Stack inStack) throws ParseException {//检查栈checkStack(inStack);Object param2 = inStack.pop();Object param1 = inStack.pop();if ((param1 instanceof Number) && (param2 instanceof Number)) {double p1 = ((Number) param2).doubleValue();double p2 = ((Number) param1).doubleValue();double result = Math.min(p1, p2);inStack.push(new Double(result));} else {throw new ParseException("Invalid parameter type");}return;}}
max函数 两数取最大值
static class Max extends PostfixMathCommand {public Max() {super();// 使用参数的数量numberOfParameters = 2;}@Overridepublic void run(Stack inStack) throws ParseException {//检查栈checkStack(inStack);Object param2 = inStack.pop();Object param1 = inStack.pop();if ((param1 instanceof Number) && (param2 instanceof Number)) {double p1 = ((Number) param2).doubleValue();double p2 = ((Number) param1).doubleValue();double result = Math.max(p1, p2);inStack.push(new Double(result));} else {throw new ParseException("Invalid parameter type");}return;}}
验证是否好用
public static void main(String[] args) {JEP jep = new JEP();// 添加常用函数jep.addStandardFunctions();// 添加常用常量jep.addStandardConstants();// 添加自定义函数jep.addFunction("min", new Min());jep.addFunction("max", new Max());String min = "min(A1,A2)";String max = "max(A1,A2)";jep.addVariable("A1", 1.1);jep.addVariable("A2", 2.3);try { //执行jep.parseExpression(min);double minResult = jep.getValue();jep.parseExpression(max);double maxResult = jep.getValue();System.out.println("最小值为: " + minResult);System.out.println("最大值为: " + maxResult);} catch (Throwable e) {System.out.println("An error occured: " + e.getMessage());}}
完全没问题