关于java.math.BigInteger

时间:2009-12-24 20:51:38

标签: java biginteger

当我尝试计算像“7 + 3”之类的字符串然后将结果存储在BigInteger变量中时,我面临BigInteger的问题,它会抛出一个NumberFormat异常。有关这如何工作的任何指示? 例如:

    String ist="7+2";
    java.math.BigInteger a = new java.math.BigInteger(ist);

5 个答案:

答案 0 :(得分:9)

BigInteger sum =(new BigInteger(7))。add(new BigInteger(3))

JepLiteJeksJbcParserMESPJEP都是可以解析“7 + 3”之类的表达式

答案 1 :(得分:6)

BigInteger无法计算表达式。 事实上,我不知道Java中的任何解决方案来评估任意算术表达式 - 您可以尝试使用Groovy或者自己解析表达式。

如果您正在考虑解析,最简单的方法可能是从中缀符号转换为波兰符号,然后一次评估一个操作符的波兰形式。查看调车场算法。

答案 2 :(得分:2)

BigInteger只会在您传递new java.math.BigInteger("9")之类的数值时理解这一点。它无法解析您提供的内容。

答案 3 :(得分:2)

正如diciu和Peter Lang所说,BigInteger无法评估表达式。如果需要数字,在评估时会溢出某些原语(如Integer),您可以创建两个BigIntegers,然后计算结果。例如:

java.math.BigInteger a = new java.math.BigInteger("7").add(new java.math.BigInteger("2"));

答案 4 :(得分:1)

如果你真的想要评估字符串并且不介意使用s表达式,那么你可以使用Clojure:

Clojure 1.0.0-
user=> (def s "(+ 7 3)")
#'user/s
user=> (load-string s)
10
user=>

以下是instructions for invoking Clojure from Java

如果采取这种方法,在评估之前要小心消毒字符串,否则你可能会对注射攻击开放。

BTW当Clojure评估表达式时,如果需要,它将使用BigInteger,例如:

user=> (def s "(+ 1 2)")
#'user/s
user=> (def r (load-string s))
#'user/r
user=> (. r getClass)
java.lang.Integer
user=> (def s "(+ 1000000000000000000000000 20000000000000000000000)")
#'user/s
user=> (def r (load-string s))
#'user/r
user=> (. r getClass)
java.math.BigInteger
user=>