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