Инициализация со строкой в ​​научном формате в Java BigInteger?

Мне нужно работать с большими числами (что-то в диапазоне 1E100 - 1E200). Однако класс BigInteger, который, по-видимому, подходит в целом, не распознает строки в научном формате во время инициализации, а также не поддерживает преобразование в строку в формате.

BigDecimal d = new BigDecimal("1E10"); //works
BigInteger i1 = new BigInteger("10000000000"); //works
BigInteger i2 = new BigInteger("1E10"); //throws NumberFormatException
System.out.println(d.toEngineeringString()); //works
System.out.println(i1.toEngineeringString()); //method is undefined

Есть ли способ? Я не могу себе представить, что такой класс был спроектирован с предположением, что пользователи должны вводить сотни нулей во входных данных.

Ответ 1

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

Java обеспечивает способ обойти это, позволяя BigDecimal анализировать научную нотацию для вас, а затем преобразовывать значение в BigInteger с помощью toBigInteger:

BigInteger i2 = new BigDecimal("1E10").toBigInteger();

Преобразование в научную нотацию можно сделать, построив BigDecimal с помощью конструктора