【问题标题】:print the decimal equivalent of a binary number in java在java中打印二进制数的十进制等价物
【发布时间】:2014-04-24 21:46:45
【问题描述】:

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

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。我试试 修复它,但找不到错误在哪里。你们能帮帮我吗?

【问题讨论】:

  • 如果你想让用户输入一个二进制数,你不应该要求一个整数; String 会更合适。首先,要求一个整数将您限制为 10 位,因为最大可能的十进制整数是 10 位。其次,不能泛化为十六进制。

标签: java binary decimal


【解决方案1】:

问题在于 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)

然后,当您将其添加到 decimal 时,它会转换为 (int)。它将最后一个值截断为 17,但为时已晚。

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

【讨论】:

  • 感谢您的解释。我学到了很多...顺便说一句,如何使用字符串输入来做到这一点?
  • 使用charAt 访问每个字符。最简单的方法是保持流动总和。从左到右查看字符串。对于每个'0' 的字符,将当前总和加倍;如果是'1',则将当前总和加倍并加1。其他任何内容都是错误的。相同的原理可用于任何基数:将当前值乘以基数,然后将每个数字的值相加,从左到右。
【解决方案2】:

尝试使用:

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。

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2023-04-11
    • 2013-03-31
    • 2020-03-31
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2022-11-29
    • 2011-12-27
    相关资源
    最近更新 更多