user2070292
user2070292

Reputation: 147

Binary to Decimal Conversion Java Code Bug

So I'm doing a project where I have to do conversions from binary numbers to decimals etc. This is my code so far and there is a bug. In a binary number such as 1101 the decimal number that is suppose to come out is 13 but the number that comes out of the code is 11. This bug happens to all binary numbers that starts with a bunch of 1's and like a single 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
   * 
   */
  }

}

Upvotes: 0

Views: 7290

Answers (5)

javacoder
javacoder

Reputation: 1

 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;
    }

}

Upvotes: 0

Carl Knoettner
Carl Knoettner

Reputation: 1

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);
    }
}

Upvotes: 0

Petro Semeniuk
Petro Semeniuk

Reputation: 7038

Symmetry is the answer. If you look into all your tests inputs they all are symmetrical except 1101

Your algorithm is correct with the exception that instead of index in Math.pow you need to use Math.pow(2.0, charArray.length - i - 1), below is the correct implementation(really only small incremental change)

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);
    }
}

Upvotes: 0

Tom Leese
Tom Leese

Reputation: 19699

Your expected results are being calculated as if the binary string is read from right to left; however, your code is reading the binary string from left to right.

Change this:

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

To this:

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

You should also change to using an integer as your index, like this:

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

Upvotes: 1

rgettman
rgettman

Reputation: 178263

You are going through your bits in the wrong order. Your first index refers to the most significant bit, not the least significant bit.

Your call to Math.pow should be

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

And as Tom Leese has already pointed out, please use an integer for your looping index.

Upvotes: 0

Related Questions