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

3pi*_*que 3 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);

    }

}
Run Code Online (Sandbox Code Playgroud)

当我输入1101时,它输出13,这是正确的答案.但是,当我测试数字11001时,十进制等值应该是25,但它输出26.我尝试修复它但无法找到bug的位置.你能帮助我吗?

ajb*_*ajb 5

问题是Math.pow返回一个浮点数,你正在进行浮点计算,你认为你正在进行整数计算.什么时候i是4,你计算

b/Math.pow(10,i)%10*Math.pow(2,i);
Run Code Online (Sandbox Code Playgroud)

计算如下:

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)
Run Code Online (Sandbox Code Playgroud)

然后(int)在添加时将其强制转换为decimal.它将最后一个值截断为17,但为时已晚.

Math.pow结果转换为a (int)将使其工作.但无论如何,这不是正确的方法.如果你想学习如何自己而不是使用parseInt它,最好输入数字作为String(参见我之前的评论),然后你不必担心将这些位作为十进制数字或10的幂来取消无论如何.即使使用您的方法,在每次循环迭代中Math.pow保留powerOf10powerOf2修改的整数变量也会更简单powerOf10 *= 10; powerOf2 *= 2;.