Roman
Roman

Reputation: 2365

Initialization with string in scientific format in Java BigInteger?

I have a need to work with large numbers (something in range 1E100 - 1E200). However, the BigInteger class, which seems to be suitable in general, does not recognize strings in scientific format during initialization, as well as does not support the conversion to a string in the format.

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

Is there a way around? I cannot imagine that such class was designed with assumption that users must type hundreds of zeros in input.

Upvotes: 11

Views: 1647

Answers (1)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 727047

Scientific notation applies to BigIntegers only in a limited scope - i.e. when the number in front of E is has as many or fewer digits after the decimal point than the value of the exponent. In all other situations some information would be lost.

Java provides a way to work around this by letting BigDecimal parse the scientific notation for you, and then converting the value to BigInteger using toBigInteger method:

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

Conversion to scientific notation can be done by constructing BigDecimal using a constructor that takes BigInteger:

System.out.println(new BigDecimal(i2).toEngineeringString());

Upvotes: 13

Related Questions