You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio使用Rhino执行含Math.pow表达式报语法错误如何解决?

问题修复方案

错误根因

  • Rhino引擎执行的是JavaScript语法,你拼接的表达式中使用了Java特有的(float)强制类型转换语法,JavaScript不识别该语法,因此触发语法解析错误,该报错和Math.pow本身无关。
  • 你调用engine.eval时额外添加的开头;本身不会触发错误,但属于冗余内容。

修复步骤

1. 移除Java语法标记

删除拼接equation时的(float)前缀,以及eval时开头多余的;。

2. 替换为JS兼容的类型转换逻辑

如果需要确保返回值为浮点类型,可在JS表达式中使用parseFloat()包裹,或者在Java层拿到执行结果后做类型转换。

3. 优化x^匹配逻辑(可选但必要)

现有代码中使用func.indexOf(c)获取x的位置,当表达式存在多个x时会永远匹配第一个x的位置,导致逻辑错误,直接用当前循环下标i读取相邻字符即可。

修复后的核心代码

private Object place_X_in_func(String raw_func, float num){
    String func = raw_func.replace(" ", "");
    StringBuilder equation = new StringBuilder(); // 用StringBuilder拼接更高效
    int i = 0;
    while(i < func.length()) {
        boolean isPow = false;
        char c = func.charAt(i);
        if(c == 'x' || c == 'X'){
            // 直接用当前下标i判断后续字符,不要用indexOf
            if(i + 1 < func.length() && func.charAt(i+1) == '^'){
                if(i + 2 < func.length()){
                    char z = func.charAt(i+2);
                    equation.append("Math.pow(").append(num).append(",").append(z).append(")");
                    i+= 3;
                    isPow = true;
                }
            }
            else{
                equation.append(num);
            }
        }
        else {
            equation.append(c);
        }
        if(!isPow){
            i += 1;
        }
    }
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino");
    try {
        System.out.println("EQ => "+equation);
        // 移除了开头的;和之前的(float)前缀
        Object result = engine.eval(equation.toString());
        // Java层转float按需开启
        // float floatResult = ((Number) result).floatValue();
        System.out.println(result);
        return ("R:"+result);
    } catch (ScriptException e) {
        System.out.println(e.getMessage());
    }
    return  0;
}

测试验证

你示例的表达式2*Math.pow(NaN,2)-1在修复后可正常执行,返回结果为NaN符合预期。

内容的提问来源于stack exchange,提问作者GeverAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:15:04