我的代码是打印用户输入的二进制数的十进制等值。
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.print("Enter a binary integer: ");
int b=in.nextInt();
int digits=1;
int q=b;
//determine the number of digits
while(q/10>=1){
++digits;
q/=10;
}
System.out.println(digits);
int decimal=0;
int i=0;
//pick off the binary number's digits and calculate the decimal equivalent
while(i<=digits-1){
decimal+=b/Math.pow(10,i)%10*Math.pow(2,i);
i++;
}
System.out.println(decimal);
}
}
当我输入1101时,它输出13,这是正确的答案。但是,当我 测试数字11001,十进制当量应该是25,但它输出26.我试试 修复它但无法找到错误的位置。你能帮助我吗?
答案 0 :(得分:5)
问题是Math.pow
返回一个浮点数,并且您在进行浮点计算时认为您正在进行整数计算。当i
为4时,您计算
b/Math.pow(10,i)%10*Math.pow(2,i);
计算如下:
b = 11001
b / Math.pow(10,i) = b / 10000 = 1.1001 (not 1)
1.1001 % 10 = 1.1001
1.1001 * Math.pow(2,i) = 1.1001 * 16 = 17.6016 (not 16)
当您将其添加到(int)
时,会将其转换为decimal
。它将最后一个值截断为17,但为时已晚。
将Math.pow
结果投射到(int)
会使其有效。但无论如何,这不是正确的方法。如果您想自己学习如何操作,而不是使用parseInt
,最好将该数字作为String
输入(请参阅我之前的评论),然后您就不要使用Math.pow
。无论如何,我不得不担心将这些位作为十进制数字或10的幂来取消。即使使用您的方法,而不是powerOf10
,在每次循环迭代中使用powerOf2
保留powerOf10 *= 10; powerOf2 *= 2;
和{{1}}整数变量会更简单。
答案 1 :(得分:0)
尝试使用:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.print("Enter a binary integer: ");
int b=in.nextInt();
int answer = Integer.parseInt(in.nextInt() + "", 2);
System.out.println("The number is " + answer + ".");
}
}
2代表基地2。