java 使用JEP解析字符串計算公式 求值(附帶自定義函數編寫)


https://blog.csdn.net/weixin_40461281/article/details/105584570

 

2.X 存在精確度問題 推薦使用3.X 參考文章: java 使用 jep3.5 解析公式自動計算(包含BigDecimal模式 浮點數精准計算)

1.增加jep依賴

  1.  
    <dependency>
  2.  
    <groupId>org.scijava </groupId>
  3.  
    <artifactId>jep </artifactId>
  4.  
    <version>2.4.2 </version>
  5.  
    </dependency>

2.計算公式  

JEP本身支持的函數 如果沒有需要的函數  下文有自定義函數實現

計算 M12*3.14/4*pow(O5,2)*(K11+273-G11)/(G12*sqrt(3.14*M11*P11)) 的值  夠復雜吧

  1.  
    public static void main(String[] args) {
  2.  
    JEP jep = new JEP();
  3.  
    // 添加常用函數
  4.  
    jep.addStandardFunctions();
  5.  
    // 添加常用常量
  6.  
    jep.addStandardConstants();
  7.  
     
  8.  
    String exp = "M12*3.14/4*pow(O5,2)*(K11+273-G11)/(G12*sqrt(3.14*M11*P11))"; //給變量賦值
  9.  
    jep.addVariable( "M12", 1.1);
  10.  
    jep.addVariable( "O5", 11.28665296);
  11.  
    jep.addVariable( "K11", 25);
  12.  
    jep.addVariable( "G11", 200);
  13.  
    jep.addVariable( "G12", 100000);
  14.  
    jep.addVariable( "M11", 0.000000129);
  15.  
    jep.addVariable( "P11", 10);
  16.  
     
  17.  
    try { //執行
  18.  
    jep.parseExpression(exp);
  19.  
    double result = jep.getValue();
  20.  
    System.out.println( "計算結果: " + result);
  21.  
    } catch (Throwable e) {
  22.  
    System.out.println( "An error occured: " + e.getMessage());
  23.  
    }
  24.  
    }

完全不是問題

3.實現自定義函數 min max

min函數 兩數取最小值

  1.  
    public class Min extends PostfixMathCommand {
  2.  
    public Min() {
  3.  
    super();
  4.  
    // 使用參數的數量
  5.  
    numberOfParameters = 2;
  6.  
    }
  7.  
     
  8.  
    @Override
  9.  
    public void run(Stack inStack) throws ParseException {
  10.  
    //檢查棧
  11.  
    checkStack(inStack);
  12.  
    Object param2 = inStack.pop();
  13.  
    Object param1 = inStack.pop();
  14.  
     
  15.  
    if ((param1 instanceof Number) && (param2 instanceof Number)) {
  16.  
    double p1 = ((Number) param2).doubleValue();
  17.  
    double p2 = ((Number) param1).doubleValue();
  18.  
     
  19.  
    double result = Math.min(p1, p2);
  20.  
     
  21.  
    inStack.push( new Double(result));
  22.  
    } else {
  23.  
    throw new ParseException( "Invalid parameter type");
  24.  
    }
  25.  
    return;
  26.  
    }
  27.  
     
  28.  
    }

max函數 兩數取最大值

  1.  
    static class Max extends PostfixMathCommand {
  2.  
    public Max() {
  3.  
    super();
  4.  
    // 使用參數的數量
  5.  
    numberOfParameters = 2;
  6.  
    }
  7.  
     
  8.  
    @Override
  9.  
    public void run(Stack inStack) throws ParseException {
  10.  
    //檢查棧
  11.  
    checkStack(inStack);
  12.  
    Object param2 = inStack.pop();
  13.  
    Object param1 = inStack.pop();
  14.  
     
  15.  
    if ((param1 instanceof Number) && (param2 instanceof Number)) {
  16.  
    double p1 = ((Number) param2).doubleValue();
  17.  
    double p2 = ((Number) param1).doubleValue();
  18.  
     
  19.  
    double result = Math.max(p1, p2);
  20.  
     
  21.  
    inStack.push( new Double(result));
  22.  
    } else {
  23.  
    throw new ParseException( "Invalid parameter type");
  24.  
    }
  25.  
    return;
  26.  
    }
  27.  
     
  28.  
    }

驗證是否好用

  1.  
    public static void main(String[] args) {
  2.  
    JEP jep = new JEP();
  3.  
    // 添加常用函數
  4.  
    jep.addStandardFunctions();
  5.  
    // 添加常用常量
  6.  
    jep.addStandardConstants();
  7.  
    // 添加自定義函數
  8.  
    jep.addFunction( "min", new Min());
  9.  
    jep.addFunction( "max", new Max());
  10.  
     
  11.  
    String min = "min(A1,A2)";
  12.  
    String max = "max(A1,A2)";
  13.  
    jep.addVariable( "A1", 1.1);
  14.  
    jep.addVariable( "A2", 2.3);
  15.  
     
  16.  
    try { //執行
  17.  
    jep.parseExpression(min);
  18.  
    double minResult = jep.getValue();
  19.  
    jep.parseExpression(max);
  20.  
    double maxResult = jep.getValue();
  21.  
    System.out.println( "最小值為: " + minResult);
  22.  
    System.out.println( "最大值為: " + maxResult);
  23.  
    } catch (Throwable e) {
  24.  
    System.out.println( "An error occured: " + e.getMessage());
  25.  
    }
  26.  
    }

完全沒問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM