在Java中计算数学表达式的方法

2022-08-31 19:38:14

在我的一个项目中,我想添加一个功能,用户可以在公式中提供,例如

sin (x + pi)/2 + 1

我在我的Java应用程序中使用

/**
 * The formula provided by the user
 */
private String formula; // = "sin (x + pi)/2 + 1"

/*
 * Evaluates the formula and computes the result by using the
 * given value for x
 */
public double calc(double x) {
    Formula f = new Formula(formula);
    f.setVar("x", x);
    return f.calc();
    // or something similar
}

如何计算数学表达式?


答案 1

还有exp4j,一个基于Dijkstra的调车场的表达式计算器。它是在Apache许可证2.0下免费提供和可再发行的,大小只有大约25KB,并且非常易于使用:

Calculable calc = new ExpressionBuilder("3 * sin(y) - 2 / (x - 2)")
        .withVariable("x", varX)
        .withVariable("y", varY)
        .build()
double result1=calc.calculate();

当使用较新的 API 版本时,例如:0.4.8

Expression calc = new ExpressionBuilder("3 * sin(y) - 2 / (x - 2)")
    .variable("x", x)
    .variable("y", y)
    .build();
double result1 = calc.evaluate();

exp4j 中还有一个使用自定义函数的工具。


答案 2

为了扩展列表,我也刚刚完成了一个:

https://github.com/uklimaschewski/EvalEx

EvalEx是Java的一个方便的表达式计算器,它允许计算简单的数学和布尔表达式。

主要特点:

  • 使用 BigDecimal 进行计算和结果
  • 单类实现,非常紧凑
  • 与外部库无依赖关系
  • 可设置精度和舍入模式
  • 支持变量
  • 标准布尔运算符和数学运算符
  • 标准基本数学和布尔函数
  • 可以在运行时添加自定义函数和运算符

例子:

BigDecimal result = null;

Expression expression = new Expression("1+1/3");
result = expression.eval():
expression.setPrecision(2);
result = expression.eval():

result = new Expression("(3.4 + -4.1)/2").eval();

result = new Expression("SQRT(a^2 + b^2").with("a","2.4").and("b","9.253").eval();

BigDecimal a = new BigDecimal("2.4");
BigDecimal b = new BigDecimal("9.235");
result = new Expression("SQRT(a^2 + b^2").with("a",a).and("b",b).eval();

result = new Expression("2.4/PI").setPrecision(128).setRoundingMode(RoundingMode.UP).eval();

result = new Expression("random() > 0.5").eval();

result = new Expression("not(x<7 || sqrt(max(x,9)) <= 3))").with("x","22.9").eval();