我需要使用大数字(在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
有办法解决吗?我无法想象这样的类是在假设用户必须输入数百个零的情况下设计的。
答案 0 :(得分:13)
科学记数法仅在有限范围内适用于BigInteger
- 即E
前面的数字在小数点后面的数字比指数的值多或少。在所有其他情况下,某些信息将丢失。
Java提供了一种解决方法,方法是让BigDecimal
为您解析科学记数法,然后使用toBigInteger
方法将值转换为BigInteger
:
BigInteger i2 = new BigDecimal("1E10").toBigInteger();
使用constructor that takes BigInteger
构建BigDecimal
可以转换为科学记数法:
System.out.println(new BigDecimal(i2).toEngineeringString());