0

Java で BeanShell Interpreter を使用して、文字列計算を解決しています。問題は、インタープリターでは実行できない解析を自分で行い、部分的な結果を 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 として宣言していなくても、onをBigDecimal呼び出して渡すことができます。これは、BeanShell がコードを実行しているときに、 と の具体的な型を認識し、リフレクションを使用してその場でメソッドを解決するためです。addxyxy

于 2013-09-11T18:28:01.050 に答える