【问题标题】:java math.​mxparser returns NaN when argument name is "e"java math.​mxparser 在参数名称为“e”时返回 NaN
【发布时间】:2019-11-16 14:34:13
【问题描述】:

我使用math.​mxparser在java类中评估java(j2ee)中的简单公式, 公式存储在数据库中,所以对于这个例子是“a+b+c”,我的意思是在这个公式中“e”没有使用, 但是当我的任何参数命名为“e”时,它会返回“NaN”(哦!)

            Argument a = new Argument("a = " + (jjNumber.isFloat(final_values_date_a.get(i).get("_val").toString()) ? final_values_date_a.get(i).get("_val").toString() : "0"));
            Argument b = new Argument("b = " + (jjNumber.isFloat(final_values_date_b.get(i).get("_val").toString()) ? final_values_date_b.get(i).get("_val").toString() : "0"));
            Argument c = new Argument("c = " + (jjNumber.isFloat(final_values_date_c.get(i).get("_val").toString()) ? final_values_date_c.get(i).get("_val").toString() : "0"));
            Argument d = new Argument("d = " + (jjNumber.isFloat(final_values_date_d.get(i).get("_val").toString()) ? final_values_date_d.get(i).get("_val").toString() : "0"));
            Argument e = new Argument("e = " + (jjNumber.isFloat(final_values_date_e.get(i).get("_val").toString()) ? final_values_date_e.get(i).get("_val").toString() : "0"));
            Argument f = new Argument("f = " + (jjNumber.isFloat(final_values_date_f.get(i).get("_val").toString()) ? final_values_date_f.get(i).get("_val").toString() : "0"));
            Argument g = new Argument("g = " + (jjNumber.isFloat(final_values_date_g.get(i).get("_val").toString()) ? final_values_date_g.get(i).get("_val").toString() : "0"));
            Expression exp = new Expression(indicatorRow.get(0).get(_formula).toString(), a,b,c,d, e ,f,g );
            double v = exp.calculate();

当我将“e”更改为“e1”(或“x”、“y”、“z1”等除“e”之外的所有内容)时效果很好,如下面的代码:

                Argument e = new Argument("e1 = " + (jjNumber.isFloat(final_values_date_e.get(i).get("_val").toString()) ? final_values_date_e.get(i).get("_val").toString() : "0"));

这是图书馆的错误吗?还是有什么错误?

【问题讨论】:

  • 也许“e”是为自然对数 2.718 的底保留的......
  • avoid names reserved as parser keywords, in general words known in mathematical language as function names - 来自Argument docs。

标签: java math eval evaluate


【解决方案1】:

是的,'e' 是保留关键字。这可以通过关键字操作选项轻松更改。

如果您只想删除一个关键字或几个关键字:

mXparser.removeBuiltinTokens(...)

API: http://mathparser.org/api/org/mariuszgromada/math/mxparser/mXparser.html#removeBuiltinTokens-java.lang.String...-

如果不想删除,而是修改关键字

mXparser.modifyBuiltinToken(...)

API: http://mathparser.org/api/org/mariuszgromada/math/mxparser/mXparser.html#modifyBuiltinToken-java.lang.String-java.lang.String-

此外,您可以设置 mXparser 选项,表明您希望 mXparser 始终将用户关键字视为更重要的内容

mXparser.setToOverrideBuiltinTokens()

API: http://mathparser.org/api/org/mariuszgromada/math/mxparser/mXparser.html#setToOverrideBuiltinTokens--

查看教程: https://mathparser.org/mxparser-tutorial/built-in-tokens-key-words-manipulation/

此外,您正在使用非最佳构造函数设置参数 - 在您的情况下,使用效率会更高

public Argument​(String argumentName, double argumentValue)

API: http://mathparser.org/api/org/mariuszgromada/math/mxparser/Argument.html#Argument-java.lang.String-double-

另外 - 这个软件也使用 mXparser - 你可以学习语法 Scalar Calculator app

最好的问候

【讨论】:

    【解决方案2】:

    也许“e”是为自然对数 2.718.... 的底保留的。

        public static void main(String[] args) {
        Argument a = new Argument("a = 40.8" );
        Argument b = new Argument("b = 20.2"); 
        Expression exp = new Expression("e", a, b );
                double v = exp.calculate();
                System.out.println("$$$$$$$$$$$>>>>>>>" + v);
    
    }
    

    $$$$$$$$$$$>>>>>>>2.718281828459045

    【讨论】:

    猜你喜欢
    • 2018-11-07
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多