在java中打印二进制数的十进制等值

时间:2014-03-18 22:34:24

标签: java binary decimal

我的代码是打印用户输入的二进制数的十进制等值。

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.我试试 修复它但无法找到错误的位置。你能帮助我吗?

2 个答案:

答案 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。