是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呢? 还是有意为之?
溢出了?
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());仅仅在二进制字符串前添加负号仍会报错:
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);所以说,非得要通用,却又弄得顾此失彼
楼主,先看看这样编译器会不会报错
inti=10000000000000000000000000000000;版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。