0

我正在使用 Java 中的 BeanShell 解释器来解决字符串计算。问题是我自己做了一些解释器无法完成的解析,并将部分结果存储在 BigInteger 中。然后我把所有东西拼凑起来,给它解释器来解决,但是我收到的数字BigInteger.toPlainString()太大了,interpreter.eval(...)因为我收到了以下错误消息:

 Parse error at line 1, column 10 : Error or number too big for integer type: 2432902008176640000
    Parse error at line 1, column 10 : Error or number too big for integer type: 2432902008176640000

计算字符串的构造如下:

    BigDecimal x = new BigDecimal(/*very big number*/);
    BigDecimal y = new BigDecimal(/*very big number*/);
    String s = x.toPlainString() + "+" + y.toPlainString();

    Interpreter i = new Interpreter();
    i.eval("result = " + s);
    s = i.get("result").toString();

我知道在这种情况下,我可以通过提供的 BigDecimal 函数简单地添加数字,但在我的情况下,计算要复杂得多!是否有可能的解决方法,所以我也可以使用具有大量数字的 beanshell 评估器?

4

1 回答 1

2

我假设你的场景真的更复杂,所以你不能在没有 BeanShell 的情况下做到这一点:

s = x.add(y).toString();

如果是这种情况,您应该知道可以BigDecimal直接从表达式访问对象:

i.set("x", x);
i.set("y", y);
i.eval("result = x.add(y);");
s = i.get("result").toString();

你甚至可以这样做:

String someBigNumber1, someBigNumber2;
// Set the number strings
i.set("xStr", someBigNumber1);
i.set("yStr", someBigNumber2);
i.eval("import java.math.BigDecimal;");
i.eval("result = new BigDecimal(xStr).add(new BigDecimal(yStr));");
s = i.get("result").toString();

BeanShell 使用动态 AST 解析和反射来解释指令并根据具体类型解析方法:1)传递给它的东西和 2)方法返回的东西。var这与各种脚本语言如何具有未明确键入的变量非常相似。例如,因为 BeanShell 使用解释器并且它在运行时解析类型而不是“编译时”(在创建 AST 之外不存在于 BeanShell 中,它是解析而不是编译),这在 BeanShell 中是合法的:

i.set("xStr", someBigNumber1);
i.set("yStr", someBigNumber2);
i.eval("import java.math.BigDecimal;");
i.eval("x = new BigDecimal(xStr);");
i.eval("y = new BigDecimal(yStr);");
i.eval("result = x.add(y);");
s = i.get("result").toString();

即使我没有声明xand yas BigDecimal,我仍然可以调用addx传入y。这是因为当 BeanShell 运行代码时,它知道具体类型xy使用反射动态解析方法。

于 2013-09-11T18:28:01.050 回答