Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的双科学记数法到十进制记数法_Java_Double - Fatal编程技术网

java中的双科学记数法到十进制记数法

java中的双科学记数法到十进制记数法,java,double,Java,Double,我试图在java中将科学双精度转换为十进制双精度。我正在发送一个从C++上编码的服务器的值,它运行在x86小字节机器上,我使用HtNoL,NtoHL方法进行转换,然后将数据发送到java上编码的客户端。但是现在,我必须发送这个值,没有像LE那样的转换。转换正在客户端java端完成。其他类型可以正确转换,但对于double,则不存在此类型。当客户端接收到双重类型时,无法正确读取此值。这是我的双重转换的java代码 protected int readInt(InputStream stream)

我试图在java中将科学双精度转换为十进制双精度。我正在发送一个从C++上编码的服务器的值,它运行在x86小字节机器上,我使用HtNoL,NtoHL方法进行转换,然后将数据发送到java上编码的客户端。但是现在,我必须发送这个值,没有像LE那样的转换。转换正在客户端java端完成。其他类型可以正确转换,但对于double,则不存在此类型。当客户端接收到双重类型时,无法正确读取此值。这是我的双重转换的java代码

protected int readInt(InputStream stream) throws IOException {
    int i0 = read(stream);
    int i1 = read(stream);
    int i2 = read(stream);
    int i3 = read(stream);
     int i=(i0 << 24) + (i1 << 16) + (i2 << 8) + (i3 << 0);
    return i;
}
protected double readDouble(InputStream stream) throws IOException {
    int i0 = readInt(stream);
    int i1 = readInt(stream);
    return Double.longBitsToDouble(((long)i0 << 32) + (i1 & 0xffffffffL));      
}
在所有这些步骤之后,如果我从服务器发送0.3,我得到了9.534475227E-315。
感谢和问候。

听起来您从客户机读取的值是错误的,但无论如何,NumberFormat是您的朋友:


编辑:考虑到你发布的代码示例,我不得不同意@trashgood的说法,你的转换代码有缺陷。也许DataInputStream可以提供帮助->

听起来您从客户端读取的值是错误的,但无论如何,NumberFormat是您的朋友:


编辑:考虑到你发布的代码示例,我不得不同意@trashgood的说法,你的转换代码有缺陷。也许DataInputStream可以帮助->

如果您将0.3从服务器发送到客户端并返回9.534475227E-315,那么您应该做的最后一件事是再次将该值转换为0.3。返回值在f-p术语中非常接近于0,表明发送和返回过程中存在一些错误


我对你的问题感到困惑,我不知道Java实现了一个十进制类,但我的Java知识又老又少。你是说一个大的小数点吗?或者您正在转换浮点数的字符串格式,这将是一个完全不同的问题?

如果您将0.3从服务器发送到客户端,并返回9.534475227E-315,那么您最不应该做的事情就是再次将该值转换为0.3。返回值在f-p术语中非常接近于0,表明发送和返回过程中存在一些错误


我对你的问题感到困惑,我不知道Java实现了一个十进制类,但我的Java知识又老又少。你是说一个大的小数点吗?或者您正在转换浮点数字的字符串格式,这将是一个完全不同的难题?

您的转换在几个方面存在缺陷,包括使用有符号算术和不正确的位值。您可以研究并查看此条目中显示的方法。

您的转换在几个方面存在缺陷,包括使用有符号算术和不正确的位值。您可以研究并查看此条目中显示的方法。

您使用的科学符号sorta表示您正在处理类似于3.0e-1的文本数据。但我想我明白了

问题似乎只是读取以非java字顺序编写的二进制数据。为什么整数写大端,而双精度写小端?你为什么以如此奇怪的方式阅读?你的编译器不抱怨“int”吗?它可能隐藏了一个问题。编辑:我的错误-我被困在64位的双

每个人都可以看到您的数据的十六进制转储。是字节翻转了,还是仅仅是单词

也许这段代码会提供一些启示。请原谅“get-r-done”使用变量

// convert CLI argument to double, write to file, and read back
// without args, default is "0.3"
// should try negative numbers!

import java.io.*;

public class BinaryFile {

    public static void main(String[] args) {

        String strFilePath = "WordFlippedDouble";
        boolean WRITEOP = true;
        double d, dd = 0.3;
        long ddFlip;

        if(args.length > 0) {
            dd = Double.valueOf(args[0]);
        }
        System.out.println("Starting with " + dd + " looks like " + 
            Long.toHexString(Double.doubleToLongBits(dd)));

        if(WRITEOP) {
            ddFlip = Double.doubleToLongBits(dd);
            ddFlip = (ddFlip<<32) | ((ddFlip>>32) & 0xFFFFFFFFL);
            System.out.println("WRITE: (flipped) looks like   " + Long.toHexString(ddFlip));
            try {
                FileOutputStream fout = new FileOutputStream(strFilePath);
                DataOutputStream dout = new DataOutputStream(fout);
                dout.writeLong(ddFlip);
                dout.close();
            } catch (Exception e) {
                System.out.println("ERROR: " + e.getMessage());
            }
        }

        if(false) return;                // testing

        try {
            FileInputStream fin = new FileInputStream(strFilePath);
            DataInputStream din = new DataInputStream(fin);
            ddFlip = din.readLong();
            d = Double.longBitsToDouble((ddFlip<<32) | ((ddFlip>>32) & 0xFFFFFFFFL));                                                     
            System.out.println("READ:  " + Long.toHexString(ddFlip) + " converts to " + 
                d + " DIFF: " + (dd-d));
            din.close();
        } catch(FileNotFoundException e) { 
            System.out.println("FileNotFoundException : " + e);
        }
        catch(IOException e) {
            System.out.println("IOException : " + e);
        }
    }
}

您使用的科学符号sorta表示您正在处理看起来像3.0e-1的文本数据。但我想我明白了

问题似乎只是读取以非java字顺序编写的二进制数据。为什么整数写大端,而双精度写小端?你为什么以如此奇怪的方式阅读?你的编译器不抱怨“int”吗?它可能隐藏了一个问题。编辑:我的错误-我被困在64位的双

每个人都可以看到您的数据的十六进制转储。是字节翻转了,还是仅仅是单词

也许这段代码会提供一些启示。请原谅“get-r-done”使用变量

// convert CLI argument to double, write to file, and read back
// without args, default is "0.3"
// should try negative numbers!

import java.io.*;

public class BinaryFile {

    public static void main(String[] args) {

        String strFilePath = "WordFlippedDouble";
        boolean WRITEOP = true;
        double d, dd = 0.3;
        long ddFlip;

        if(args.length > 0) {
            dd = Double.valueOf(args[0]);
        }
        System.out.println("Starting with " + dd + " looks like " + 
            Long.toHexString(Double.doubleToLongBits(dd)));

        if(WRITEOP) {
            ddFlip = Double.doubleToLongBits(dd);
            ddFlip = (ddFlip<<32) | ((ddFlip>>32) & 0xFFFFFFFFL);
            System.out.println("WRITE: (flipped) looks like   " + Long.toHexString(ddFlip));
            try {
                FileOutputStream fout = new FileOutputStream(strFilePath);
                DataOutputStream dout = new DataOutputStream(fout);
                dout.writeLong(ddFlip);
                dout.close();
            } catch (Exception e) {
                System.out.println("ERROR: " + e.getMessage());
            }
        }

        if(false) return;                // testing

        try {
            FileInputStream fin = new FileInputStream(strFilePath);
            DataInputStream din = new DataInputStream(fin);
            ddFlip = din.readLong();
            d = Double.longBitsToDouble((ddFlip<<32) | ((ddFlip>>32) & 0xFFFFFFFFL));                                                     
            System.out.println("READ:  " + Long.toHexString(ddFlip) + " converts to " + 
                d + " DIFF: " + (dd-d));
            din.close();
        } catch(FileNotFoundException e) { 
            System.out.println("FileNotFoundException : " + e);
        }
        catch(IOException e) {
            System.out.println("IOException : " + e);
        }
    }
}

别那样胡闹。它在标准API中。请参阅java.nio.ByteBuffer


别那样胡闹。它在标准API中。请参阅java.nio.ByteBuffer


我解决了我的问题,感谢大家的帮助。非常感谢。这就是解决方案

  protected double readDouble(InputStream stream) throws IOException {

    return Double.longBitsToDouble(((long) read(stream) & 0xff) 
                                 | ((long) (read(stream) & 0xff) << 8)
                                 | ((long) (read(stream) & 0xff) << 16)
                                 | ((long) (read(stream) & 0xff) << 24)
                                 | ((long) (read(stream) & 0xff) << 32)
                                 | ((long) (read(stream) & 0xff) << 40)
                                 | ((long) (read(stream) & 0xff) << 48)                     
                                 | ((long) (read(stream) & 0xff) << 56));  }

当我以little-endian格式从服务器发送数据时,我可以用java代码将传入的little-endian格式的值转换为big-endian格式的值。

我解决了我的问题,感谢大家的帮助。非常感谢。这就是解决方案

  protected double readDouble(InputStream stream) throws IOException {

    return Double.longBitsToDouble(((long) read(stream) & 0xff) 
                                 | ((long) (read(stream) & 0xff) << 8)
                                 | ((long) (read(stream) & 0xff) << 16)
                                 | ((long) (read(stream) & 0xff) << 24)
                                 | ((long) (read(stream) & 0xff) << 32)
                                 | ((long) (read(stream) & 0xff) << 40)
                                 | ((long) (read(stream) & 0xff) << 48)                     
                                 | ((long) (read(stream) & 0xff) << 56));  }
当我以little-endian格式从服务器发送数据时,我可以用java中的代码将传入的little-endian格式的值转换为big-endian格式的值。

你发现了什么?你试了什么?请举例说明你喜欢做什么。我有一个像9.534475227E-315这样的值,我想把它转换成0.3。为什么是0.3?因为我从服务器向客户机发送了0.3,当我从客户机读取此值时,我得到了9.534475227E-315。您需要提供更多信息,说明如何尝试转换您的正确标记。我很抱歉。我编写了一个方法,比如公共字符串formatDecimaldouble d,int precision{String myformat=,,,,0;if precision==0{//System.out.printlnOK Decimal is:+d;DecimalFormat df=new DecimalFormatmyformat;return df.formatd;}myformat=,,,0;;对于int x=0;x