首页 文章

将IEEE-754双精度和单精度转换为十进制Java错误

提问于
浏览
0

所以我目前正在开发一个将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);

}
}

一旦我为Ieee-754输入3或4转换为十进制,就会出现错误 . 它不允许我输入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

2 回答

  • 0

    你打电话的时候

    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,或者编写自己的解析器 .

  • 1

    你的问题在这里: choice = input.nextInt();

    nextInt 消耗 int ,但不消耗换行符 . 所以下次你调用 nextLine 时会收到一个空字符串,因为该行上的所有内容都已被消耗=>你需要添加一个 nextLine

    choice = input.nextInt();
    nextLine();
    
    //go on with your code
    

    同样适用于 nextDouble .

    另见:Scanner issue when using nextLine after nextXXX

相关问题