java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)

您所在的位置:网站首页 自定义函数max java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)

java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)

2024-01-20 06:53| 来源: 网络整理| 查看: 265

2.X 存在精确度问题 推荐使用3.X 参考文章: java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算)

1.增加jep依赖 org.scijava jep 2.4.2 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; } @Override public 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; } @Override public 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()); } }

完全没问题



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3