Преобразование двойной и одинарной точности IEEE-754 в десятичную ошибку Java

Итак, в настоящее время я работаю над программой, которая будет преобразовывать IEEE-754 с плавающей запятой одинарной и двойной точности в десятичное число. Программа имеет исключение java.lang.NumberFormatException. Я хотел бы, чтобы кто-нибудь объяснил мне, почему он выбрасывается и как я должен это исправить.

//This is the method being used for the IEEE-754 double-precision to decimal
//line 5 is where the error is thrown

1 double deciFinal;
2 System.out.println("What IEEE-754 double precision floating-point representsation will you like to input?");
3 ieee754 = input.nextLine();
4 ieee754 = ieee754.trim();
5 deciFinal = Double.longBitsToDouble(Long.parseLong(ieee754,2));
6 System.out.println(deciFinal);


//This is the method being used for the IEEE-754 single-precision to decimal
//Line 5 is also where the error is being thrown.

 1 int binIeee;
 2 float deciFinal;
 3 System.out.println("What IEEE-754 single precision floating-point representsation will you like to input?");
 4 ieee754 = input.nextLine();
 5 deciFinal = Float.intBitsToFloat(Integer.parseInt(ieee754, 2));
 6 System.out.println(deciFinal);

Вот мой полный код, если вы хотите сослаться на него, чтобы помочь себе понять больше

import java.util.Scanner;
/**
*
* @author Edwin
*/
public class DecimalToIEE754 {
   public static void main(String[]args){
    int choice;
    Scanner input = new Scanner(System.in);

    do{
        double deciNum;
        String ieee754 = " ";
        int bitsVal;
        String bitsString;
        System.out.println("Hello Welcome to the Decimal and IEEE-754 converter");
        System.out.println("Please select the number that correspondes with the conversion you will like:"
                + "\n 1) Convert decimal number to IEEE-754 Single Precision Floating-Point Representation"
                + "\n 2) Convert decimal number to IEEE-754 Double Precision Floating-Point Representation"
                + "\n 3) Convert IEEE-754 Single Precision Floating-Point Representation to decimal number"
                + "\n 4) Convert IEEE-754 Double Precision Floating-Point Representation to decimal number "
                + "\n 0) Exit Converter");
        choice = input.nextInt();

        if(choice == 1)
        {
            System.out.println("What decimal number will you like to convert?");
            deciNum = input.nextDouble();
            float f = (float)deciNum;
            bitsVal = Float.floatToIntBits(f);
            bitsString = Integer.toBinaryString(bitsVal);
            System.out.println(bitsString);
        }

        if(choice == 2)
        {
            System.out.println("What decimal number will you like to convert?");
            deciNum = input.nextDouble();
            bitsString = Long.toString(Double.doubleToLongBits(deciNum), 2);
            System.out.println(bitsString);
        }

        if(choice == 3)
        {
            int binIeee;
            float deciFinal;
            System.out.println("What IEEE-754 single precision floating-point representsation will you like to input?");
            ieee754 = input.nextLine();
            **deciFinal = Float.intBitsToFloat(Integer.parseInt(ieee754, 2));**
            System.out.println(deciFinal);
        }
        if(choice == 4)
        {
            double deciFinal;
            System.out.println("What IEEE-754 double precision floating-point representsation will you like to input?");
            ieee754 = input.nextLine();
            ieee754 = ieee754.trim();
            **deciFinal = Double.longBitsToDouble(Long.parseLong(ieee754,2));**
            System.out.println(deciFinal);
        }
    }while (choice != 0);

}
}

Ошибка появляется, когда я ввожу 3 или 4 для IEEE-754 для преобразования в десятичное число. Он не позволяет мне ввести номер IEEE-754. Ошибка полностью:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
   at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
   at java.lang.Integer.parseInt(Integer.java:504)
   at DecimalToIEE754.main(DecimalToIEE754.java:53)
Java Result: 1

person Edwin Lobo    schedule 13.02.2014    source источник
comment
Какой ввод, какое исключение (полное сообщение), какой вывод вы ожидали?   -  person assylias    schedule 13.02.2014
comment
Это говорит о том, что вы передали пустую строку. Распечатайте ieee754, и это, вероятно, подтвердит, что...   -  person assylias    schedule 13.02.2014
comment
Я не уверен, почему это так, потому что даже если я вручную ввожу номер IEEE754, он все равно выдает ошибку   -  person Edwin Lobo    schedule 13.02.2014
comment
Замените ieee754 = input.nextLine(); на ieee754 = "100"; и посмотрите, работает ли это. Если это так, вы знаете, что проблема в том, что input.nextLine() не делает то, что вы ожидаете.   -  person assylias    schedule 13.02.2014
comment
Да, это была проблема, я только что изменил input.nextLine() на input.next, и теперь все отлично работает, спасибо.   -  person Edwin Lobo    schedule 13.02.2014


Ответы (2)


Когда вы звоните

Scanner.nextInt();

с последующим

Scanner.nextLine();

означает, что nextLine() будет читать остальную часть строки после числа. Возможно, вы ничего не ввели после числа, поэтому nextLine возвращает пустую строку "", которую вы можете увидеть в своем исключении.

Простой способ обойти это - позвонить

int option = scanner.nextInt();
scanner.nextLine(); // ignore the rest of the line.

// now reads the next line
String line = scanner.nextLine();

Скорее всего у вас отрицательное число. Если у вас есть число (верхний бит установлен в 1) 10101010 ... 1010101 и имеет длину 32 бита, оно слишком велико для хранения в 32-битном signed int. Вы можете разобрать его как Long и привести к (int)

У вас та же проблема с попыткой разобрать 64-битный двоичный файл как Long. В этом случае вы должны использовать BigInteger и привести его к типу long или написать свой собственный синтаксический анализатор.

person Peter Lawrey    schedule 13.02.2014
comment
У меня нет введенного числа, и когда я это делаю, все еще возникает исключение. Я попробовал ваш метод проанализировать как длинный и преобразовать его в int, но он все равно выдал исключение. - person Edwin Lobo; 13.02.2014
comment
@EdwinLobo Вот тут-то и помогает внимательное чтение вашего исключения;) - person Peter Lawrey; 13.02.2014

Ваша проблема здесь: choice = input.nextInt();

nextInt использует int, но не символ перевода строки. Поэтому в следующий раз, когда вы вызовете nextLine, вы получите пустую строку, потому что все в строке уже использовано => вам нужно добавить nextLine:

choice = input.nextInt();
nextLine();

//go on with your code

То же самое относится и к nextDouble.

См. также: проблема со сканером при использовании nextLine после nextXXX

person assylias    schedule 13.02.2014
comment
Как я уже упоминал, проблема была с ieee754 = nextLine(); ничего общего с selection = input.nextInt(); так как это касается того, какой тип преобразования нужно сделать. - person Edwin Lobo; 13.02.2014
comment
@EdwinLobo И да, и нет - если вы включите nextLine после nextInt и оставите остальную часть кода, это тоже должно работать. - person assylias; 13.02.2014