# BigDecimal bigDecimal = new BigDecimal("44e016912630333") 为啥报错java.lang.NumberFormatException

`44e016912630333 就是个数字啊`

1

``BigDecimal bigDecimal = new BigDecimal(new BigInteger("44e016912630333",16));``

``````import java.math.*;
import java.lang.Double;
public class X{
public static void main(String args[]){

BigDecimal bigDecimal = new BigDecimal(new BigInteger("44e016912630333",16));
Double d = Double.valueOf("44e016912630333");
System.out.println("得到 BigDecimal 对象:" + bigDecimal);
System.out.println("得到 Double 对象:"+ d);
}
}``````

DOS 输出：

``````D:\java\test\OS_China>javac X.java

D:\java\test\OS_China>java X

D:\java\test\OS_China>``````

Double.valueOf("44e016912630333"); 得到Infinity确实超过最大值范围了。但是您说的因为字符串有e就是16进制。我认为不是这样的，比如缩短e后面的指数 new BigDecimal("44e1"); 最终结果 4.4E+2 与 Float.valueOf("44e1"); 的结果是相等的都表示 44 x 10^1 = 440。原字符串本意不是16进制。
1
`44e016912630333`

Double.valueOf("44e016912630333"); 这个就可以

1

1

```} else if ((c == 'e') || (c == 'E')) {
exp = parseExp(in, offset, len);
// Next test is required for backwards compatibility
if ((int) exp != exp) // overflow
throw new NumberFormatException();
break; // [saves a test]```

```// skip leading zeros in the exponent
while (len > 10 && (c=='0' || (Character.digit(c, 10) == 0))) {
offset++;
c = in[offset];
len--;
}
if (len > 10) // too many nonzero exponent digits
throw new NumberFormatException();```

`BigDecimal bigDecimal2 = new BigDecimal("44e00000000000000000003330");`

4.4E+3331

1
k

``BigDecimal bigDecimal = new BigDecimal(0x44e016912630333L);``

0

44e016912630333  这是指数形式的数字

0