https://blog.csdn.net/weixin_40461281/article/details/105584570
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;
-
}
-
-
-
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;
-
}
-
-
-
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());
-
}
-
}

完全沒問題
