} 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]
解析的时候会去判断后面的字符长度大于10,且转换为10进制不为0的长度,如果超过10的话,会报错。
// 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();
所以是看你e后面的字符的。
像这种就正确
BigDecimal bigDecimal2 = new BigDecimal("44e00000000000000000003330");
楼主的字符串代表的是 16 进制的数, 因为有字符 e。
因此,先要将其解析成 10 进制, 并生成一个 BigInteger 对象。
以这个对象为参数,方可得出一个 BigDecimal 对象.
注意,楼主的做法:用 Double.valueOf("44e016912630333");
想得都一个双精度的包装类对象。此法不妥。
DOS 输出:
明明是个字符串,为什么要说这是数字呢?如果是数字,是多少?
范围超了,不支持,幂数减少一些就支持了
重新回答下,bigdecimal new的时候,遍历字符串,遇到e的时候会按科学计数法去解析
解析的时候会去判断后面的字符长度大于10,且转换为10进制不为0的长度,如果超过10的话,会报错。
所以是看你e后面的字符的。
像这种就正确
4.4E+3331
如果是16 进制的数字,直接可以以数字的构造去构造,如果是字符串 带 'e',报错是正常的
44e016912630333 这是指数形式的数字
还是16jin'zhi
这个应该是超范围了吧.....44的 16912630333 次幂.......加个d吧