Относительно java.math.BigInteger - PullRequest
       21

Относительно java.math.BigInteger

0 голосов
/ 24 декабря 2009

Проблема, с которой я сталкиваюсь с BigInteger, когда я пытаюсь вычислить строку типа «7 + 3», а затем сохранить результат в переменной BigInteger, он вызывает исключение NumberFormat. Любые указатели о том, как это может работать? Например:

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

Ответы [ 5 ]

9 голосов
/ 24 декабря 2009

BigInteger sum = (новый BigInteger (7)). Add (новый BigInteger (3))

JepLite , Джекс , JbcParser , MESP и JEP - все библиотеки могут анализировать выражения как "7 + 3"

6 голосов
/ 24 декабря 2009

BigInteger не может оценить выражения. На самом деле, я не знаю ни одного решения в Java для оценки произвольных арифметических выражений - вместо этого вы можете попробовать Groovy или разобрать выражение самостоятельно.

Если вы рассматриваете синтаксический анализ, самый простой способ, вероятно, состоит в том, чтобы преобразовать из инфиксной нотации в польскую нотацию, а затем оценивать полированную форму по одному оператору за раз. Посмотрите алгоритм маневрового двора.

2 голосов
/ 24 декабря 2009

Как заявили Дичиу и Питер Лэнг, BigInteger не может оценивать выражения. Если вам нужны числа, которые при вычислении переполняют некоторый примитив, такой как Integer, вы можете создать два BigInteger и затем оценить результат. Например:

java.math.BigInteger a = new java.math.BigInteger("7").add(new java.math.BigInteger("2"));
2 голосов
/ 24 декабря 2009

BigInteger поймет это только тогда, когда вы передадите числовое значение, например new java.math.BigInteger("9"). Он не может разобрать, что вы предоставляете.

1 голос
/ 24 декабря 2009

Если вы действительно хотите оценивать строки и не возражаете против использования s-выражений, вы можете использовать Clojure:

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

Вот инструкции по вызову Clojure из Java

Если вы выберете этот путь, будьте осторожны, чтобы очистить строки перед их оценкой, иначе вы можете оставить себя открытыми для инъекционных атак.

Кстати, когда 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=>
...