Java 如何将大二进制转换为十进制?
当我输入二进制代码,比如101111101时,它就工作了。但当我输入10011010010时,它总是打印“非二进制”,而它应该是1234。如何修改它Java 如何将大二进制转换为十进制?,java,Java,当我输入二进制代码,比如101111101时,它就工作了。但当我输入10011010010时,它总是打印“非二进制”,而它应该是1234。如何修改它 import java.util.Scanner; public class Binary { public static int toDecimal(String b) { int decimal = Integer.parseInt(b,2); return decimal; }
import java.util.Scanner;
public class Binary {
public static int toDecimal(String b) {
int decimal = Integer.parseInt(b,2);
return decimal;
}
public static boolean isBinary(String b) {
int inputNum = Integer.parseInt(b);
while(inputNum != 0){
if(inputNum % 10 > 1){
return false;
}
inputNum = inputNum / 10;
}
return true;
}
public static void main(String[] args) {
System.out.print("Enter binary: ");
Scanner in = new Scanner(System.in);
String binaryNum = in.next();
try{
int intNum = Integer.parseInt(binaryNum);
boolean isBinary = isBinary(binaryNum);
if(isBinary){
int outputDecimal = toDecimal(binaryNum);
System.out.println("\n"+ outputDecimal +" in decimal");
}else{
System.out.println("\n" + "Not binary!");
}
}catch(Exception e){
System.out.println("\n" + "Not binary!");
}
}
}
问题是您试图解析的数字超过了
整数。最大值
:
试着改用。
long
有64位,范围为-9223372036854775808
到9223372036854775807
,这应该足以覆盖您的各种输入(尽管对于较长的数字显然会失败)。问题是您试图解析的数字超过了整数。最大值
:
试着改用。一个
long
有64位,其范围为-9223372036854775808
到9223372036854775807
,这应该足以覆盖您的各种输入(尽管对于较长的数字显然会失败)。虽然一次处理超过1位会更有效,但这是可行的。10000000000000000000000000000000000000000000000000000000的结果是9223372036854775808
import java.util.regex.Pattern;
import java.math.BigDecimal;
...
public static BigDecimal toDecimal(String b) {
BigDecimal bd1 = new BigDecimal(b.charAt(0)=='1'?1:0);
BigDecimal two = new BigDecimal(2);
for (int i = 1; i<b.length(); i++) {
bd1 = bd1.multiply(two);
bd1 = bd1.add(new BigDecimal(b.charAt(i)=='1'?1:0));
}
return bd1;
}
public static boolean isBinary(String b) {
return Pattern.compile("[01]+").matcher(b).matches();
}
public static void main(String[] args) {
System.out.print("Enter binary: ");
Scanner in = new Scanner(System.in);
String binaryNum = in.next();
try{
boolean isBinary = isBinary(binaryNum);
if(isBinary){
BigDecimal outputDecimal = toDecimal(binaryNum);
System.out.println("\n"+ outputDecimal +" in decimal");
}else{
System.out.println("\n" + "Not binary!");
}
}catch(Exception e){
System.out.println("\n" + "Not binary!");
}
}
虽然一次处理超过1位会更有效,但这是可行的。10000000000000000000000000000000000000000000000000000000的结果是9223372036854775808
import java.util.regex.Pattern;
import java.math.BigDecimal;
...
public static BigDecimal toDecimal(String b) {
BigDecimal bd1 = new BigDecimal(b.charAt(0)=='1'?1:0);
BigDecimal two = new BigDecimal(2);
for (int i = 1; i<b.length(); i++) {
bd1 = bd1.multiply(two);
bd1 = bd1.add(new BigDecimal(b.charAt(i)=='1'?1:0));
}
return bd1;
}
public static boolean isBinary(String b) {
return Pattern.compile("[01]+").matcher(b).matches();
}
public static void main(String[] args) {
System.out.print("Enter binary: ");
Scanner in = new Scanner(System.in);
String binaryNum = in.next();
try{
boolean isBinary = isBinary(binaryNum);
if(isBinary){
BigDecimal outputDecimal = toDecimal(binaryNum);
System.out.println("\n"+ outputDecimal +" in decimal");
}else{
System.out.println("\n" + "Not binary!");
}
}catch(Exception e){
System.out.println("\n" + "Not binary!");
}
}
为什么有这么多从字符串到int的转换?以字符串形式保存输入,以检查输入是否为二进制。最后将字符串转换为数字类型。如果您认为输入不会超过最大int值,可以使用
parseInt()
,否则可以使用long
或biginger
输入为字符串时,您的isBinary()
可能如下所示:
public static boolean isBinary(String b) {
for(int i=0; i<b.length(); i++) {
if(b.charAt(i) != '0' && b.charAt(i) != '1') {
return false;
}
}
return true;
}
为什么有这么多从字符串到int的转换?以字符串形式保存输入,以检查输入是否为二进制。最后将字符串转换为数字类型。如果您认为输入不会超过最大int值,可以使用
parseInt()
,否则可以使用long
或biginger
输入为字符串时,您的isBinary()
可能如下所示:
public static boolean isBinary(String b) {
for(int i=0; i<b.length(); i++) {
if(b.charAt(i) != '0' && b.charAt(i) != '1') {
return false;
}
}
return true;
}
当我输入10011010010时,它仍然打印“非二进制”。当我输入10011010010时,它仍然打印“非二进制”。使用这种复杂的
isBinary()
算法有什么特别的原因吗?为什么不将最佳答案标记为?您可以通过单击答案旁边的空心勾号来完成此操作。这也会增加你的重复率。使用这种复杂的isBinary()
算法有什么特别的原因吗?为什么不将最佳答案标记为?您可以通过单击答案旁边的空心勾号来完成此操作。这也会增加你的声望。@Andrew我想也许将Sааааааааааа的大整数和我的模式结合起来会是一个好方法。@Andrew我想也许将Sааааааааа?既然我们可以使用接受输入基数参数的构造函数,为什么还要手动转换为十进制呢?@Sааааааӽ是的。我不知道BigInteger基数构造函数-它很完美。我使用了BigDecimal,因为它是凌晨2点,代码已经提到了小数。糟糕的选择。如果我不喜欢我的isBinary()
为什么选择BigDecimal,我会删除答案?既然我们可以使用接受输入基数参数的构造函数,为什么还要手动转换为十进制呢?@Sааааааӽ是的。我不知道BigInteger基数构造函数-它很完美。我使用了BigDecimal,因为它是凌晨2点,代码已经提到了小数。糟糕的选择。如果我不喜欢我的isBinary()
public static BigInteger toDecimal(String b) {
return new BigInteger(b, 2);
}