Инициализация со строкой в научном формате в 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
с помощью конструктора