2013-02-13 3 views
0

Так что я делаю проект, где мне нужно делать преобразования из двоичных чисел в десятичные числа и т. Д. Это мой код до сих пор, и есть ошибка. В двоичном числе, таком как 1101, десятичное число, которое должно выйти, равно 13, но число, которое выходит из кода, равно 11. Эта ошибка происходит со всеми двоичными числами, начинающимися с пучка 1 и как один 0.Ошибка двоичного преобразования кода Java

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 
    * 
    */ 
    } 

} 
+4

не используйте 'Math.pow (...)' для любого из этого. Выпишите на бумаге, как бы вы решили это, чтобы найти свой алгоритм, но опять же, оставите мощные и ненужные вызовы метода с плавающей запятой из того, что требует только простой алгебры. Обратите внимание, что чрезмерное использование комментариев довольно отвлекает. –

+1

Это уже ответили (а): http://stackoverflow.com/questions/7437987/how-to-convert-binary-string-value-to-decimal – fons

ответ

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--) { 
+0

Спасибо за помощь !! – user2070292

0

Вы проходите ваши биты в неправильном порядке. Ваш первый индекс относится к самому значащему биту, а не младшему значащему биту.

Ваш призыв к Math.pow должен быть

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

И как Том Leese уже указывал, пожалуйста, используйте целое число для индекса по замкнутому кругу.

+0

СПАСИБО ЭТО РАБОТАЕТ СЕЙЧАС! – user2070292

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

Добро пожаловать в SO. Лучше всего, когда ответы касаются кода опроса, а не заменяют его. Если код, который предлагает опросник, является недопустимым, объяснение полезно. –

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

} 
Смежные вопросы