gpt4 book ai didi

java - 用解释器评估计算器,但值(value)很大

转载 作者:行者123 更新时间:2023-12-02 06:45:54 27 4
gpt4 key购买 nike

我正在使用 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 评估器?

最佳答案

我假设您的场景确实更复杂,因此您不能在没有 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 中不存在这种类型,AST 是解析而不是编译),因此这在 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();

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

关于java - 用解释器评估计算器,但值(value)很大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642598/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com