开发者社区> 问答> 正文

不能成功处理负数,是Java Integer.parseiInt bug吗??报错

是Java Integer.parseInt Api 的bug吗? 发现不能正常将二进制字符串(严格来说是最高有效位为1的二进制字符串)转为十进制数字,如下所示:

int i = 0x80000000;
String binString = Integer.toBinaryString(i);
int radix = 2;
		
int j = Integer.parseInt(binString, radix );
Assertions.assertThat(j).isEqualTo(i);

按理应该测试通过, 但却报错了,如下所示:

java.lang.NumberFormatException: For input string: "10000000000000000000000000000000"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:495)

看了源代码,发现只要注释掉其中的两个条件判断即可,

/*if (result < multmin) {
   throw NumberFormatException.forInputString(s);
}*/
result *= radix;
/*if (result < limit + digit) {
    throw NumberFormatException.forInputString(s);
}*/
result -= digit;

不知这算是bug呢? 还是有意为之?


展开
收起
爱吃鱼的程序员 2020-06-14 14:41:25 1062 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    溢出了?

    multmin: Int最高位,请用Long类

    LZ没有理解parseInt的用法,对于parseInt是需要明确符号的,source里有例子:*parseInt("-FF",16)returns-255,*parseInt("-2147483648",10)returns-2147483648。你这里把符号给忽略了。

    intj=Integer.parseInt("-"+binString,radix);

    不能单单添加一个负号就能解决的,见下面的回复 inti=-1;StringbinString=Integer.toBinaryString(i);intradix=2;intj=Integer.parseInt("-"+binString,radix);Assertions.assertThat(j).isEqualTo(i);

    仅仅在二进制字符串前添加负号仍会报错:

    java.lang.NumberFormatException:Forinputstring:"-11111111111111111111111111111111"atjava.lang.NumberFormatException.forInputString(NumberFormatException.java:65)atjava.lang.Integer.parseInt(Integer.java:495)

    需要更多的处理,

    StringbinString;if(i<0)binString="-"+Integer.toBinaryString(-i);else//positiveibinString=Integer.toBinaryString(i);

    所以说,非得要通用,却又弄得顾此失彼




    请使用BigInteger

    BigIntegerb=newBigInteger(binString,2);System.out.println(b.intValue());



    确实用BigInteger就很方便你想看明白此问题,请仔细看javaDoc文档.

    引用来自“zgw06629”的评论

    inti=-1;StringbinString=Integer.toBinaryString(i);intradix=2;intj=Integer.parseInt("-"+binString,radix);Assertions.assertThat(j).isEqualTo(i);

    仅仅在二进制字符串前添加负号仍会报错:

    java.lang.NumberFormatException:Forinputstring:"-11111111111111111111111111111111"atjava.lang.NumberFormatException.forInputString(NumberFormatException.java:65)atjava.lang.Integer.parseInt(Integer.java:495)

    需要更多的处理,

    StringbinString;if(i<0)binString="-"+Integer.toBinaryString(-i);else//positiveibinString=Integer.toBinaryString(i);

    所以说,非得要通用,却又弄得顾此失彼




    回复 @zgw06629:这是从哪儿看的?耳听为虚,眼见为实,自己动动手吧。如果直接传-1的话,此时radix应该是10

    楼主,先看看这样编译器会不会报错

    inti=10000000000000000000000000000000;



    //注意:字符串前有0binti=0b10000000000000000000000000000000;System.out.println(i);//-2147483648 int支持位数太低,Long也不支持你的数据长度,使用BigInteger把
    2020-06-14 14:41:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载