2.X 存在精确度问题 推荐使用3.X 参考文章: java 使用 jep3.5 解析公式自动计算(包含BigDecimal模式 浮点数精准计算)
1.JEP基础相关
请参考: java 使用JEP解析字符串计算公式 求值(附带自定义函数编写)
2.使用节点计算
注释写的很明白 要仔细看
public static void main(String[] args) {
JEP jep = new JEP();
// 允许使用未声明变量
jep.setAllowUndeclared(true);
// 允许赋值
jep.setAllowAssignment(true);
// 添加常用函数
jep.addStandardFunctions();
// 添加常用常量
jep.addStandardConstants();
// 添加自定义函数
jep.addFunction("min", new Min());
jep.addFunction("max", new Max());
// 创建公式
String exp = "a=M12*3.14/4*pow(O5,2)*(K11+273-G11)/(G12*sqrt(3.14*M11*P11))";
String mins = "b=min(H5,U7)";
String mul = "a*b";
// 给变量赋值
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);
jep.addVariable("H5", 1.2);
jep.addVariable("U7", 2.4);
try {
// 创建节点
Node node1 = jep.parse(exp);
Node node2 = jep.parse(mins);
Node node3 = jep.parse(mul);
// 计算节点
Double a = (Double)jep.evaluate(node1);
Double b = (Double)jep.evaluate(node2);
Double result = (Double)jep.evaluate(node3);
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("a*b="+result);
} catch (ParseException e) {
e.printStackTrace();
}
}