二进制到十进制转换Java代码错误

时间:2013-02-13 23:27:26

标签: java

所以我正在做一个项目,我必须从二进制数转换为小数等。 到目前为止这是我的代码,有一个bug。在二进制数中,例如1101,假设出来的十进制数是13,但是代码中出现的数字是11.这个错误发生在以一堆1开头并且像一个0开头的所有二进制数中。

import java.util.*; // imports everything in java.util

public class newCalculator{

   * Conversion asks the user for a binary number.  It converts the input to a decimal number
   * using arrays and then displays the answer to the screen.
  */

  public static void main (String[]args){ // creates the main method
  binaryToDecimal(); //calls the user defined method binaryToDecimal
  }

  public static void binaryToDecimal() {
    Scanner scan = new Scanner(System.in); // Creates a new Scanner
    System.out.println("Input a Binary Number"); // Asks the user to input their number
    String binary = scan.next(); // Creates a new String that stores the value of the input
    char[] charArray = binary.toCharArray(); //Create a new Array and implements in the input
    double answer = 0;  // Creates a new double called answer setting it to zero
    for (double index = 0; index < charArray.length; index++){//For loop
      if (charArray[(int)index] == '1') {//If statement that allows the binary input to work
        answer = answer + Math.pow(2.0, index);//Sets the answer with the math class power of 2
      }
    }
    System.out.println(answer);//Prints out the final conversion result
     /* Test Cases   Expected Result   Output
   * 101                 5             5
   * 11                  3             3
   * 1                   1             1
   * 1101                13            11<--
   * 111                 7             7
   * 1000001             65            65
   * 1111                15            15
   * 1001                9             9
   * 11101               29            23<--
   * 10101               21            21
   * 
   */
  }

}

5 个答案:

答案 0 :(得分:1)

正在计算您的预期结果,就好像从右到左读取二进制字符串一样;但是,您的代码是从左到右读取二进制字符串。

改变这个:

for (double index = 0; index < charArray.length; index++){

对此:

for (double index = charArray.length - 1; index >= 0; index--) {

您还应该更改为使用整数作为索引,如下所示:

for (int index = charArray.length - 1; index >= 0; index--) {

答案 1 :(得分:0)

你正在以错误的顺序查看你的位。您的第一个索引是指最重要的位,而不是最低位。

您对Math.pow的调用应为

answer = answer + Math.pow(2.0, (charArray.length - index - 1));

正如Tom Leese已经指出的那样,请使用整数作为循环索引。

答案 2 :(得分:0)

对称性就是答案。如果您查看所有测试输入,除1101

外,它们都是对称的

您的算法是正确的,除了index中的Math.pow而不是Math.pow(2.0, charArray.length - i - 1),您需要使用import java.util.Scanner; public class NewCalc { public static void main(String[] args) { binaryToDecimal(); } public static void binaryToDecimal() { Scanner scan = new Scanner(System.in); System.out.println("Input a Binary Number"); String binary = scan.next(); char[] charArray = binary.toCharArray(); double answer = 0; for (int i = 0; i < charArray.length; i++) { answer = charArray[i] == '1' ? answer + Math.pow(2.0, charArray.length - i - 1) : answer; } System.out.println(answer); } } ,下面是正确的实现(实际上只是很小的增量更改)

{{1}}

答案 3 :(得分:0)

package pdaproject;
import java.util.Scanner;
public class NewCalc {

    public static void main(String[] args) {
        binaryToDecimal();
    } 
    // convert to decimal (base 10)
    public static void binaryToDecimal() {
        Scanner scan = new Scanner(System.in);
        System.out.println("Input a Binary Number");
        String binary = scan.next();
        int answer = 0;
        // process left to right
        for (int i = 0; i < binary.length(); i++) {
            answer = 2 * answer + (binary.charAt(i) == '1' ? 1 : 0);
        }
        System.out.println(answer);
    }
}

答案 4 :(得分:0)

 public class BinaryToDecimal {
    static int testcase1=1001;
    public static void main(String[] args) {
        BinaryToDecimal test = new BinaryToDecimal();
        int result = test.convertBinaryToDecimal(testcase1);
        System.out.println(result);
    }

    //write your code here
    public int convertBinaryToDecimal(int binary)
    {
        int deci = 0;
        int p=1;
        int rem = 0;
        while(binary>0)
        {
            rem = binary%10;
            deci = deci+(rem*p);
            p = p*2;
            binary = binary/10;
        }

        return deci;
    }

}