我正在将最初用 VB.NET 编写的程序移植到 Java。我正在读取一个以小端顺序存储 32 位浮点数的文件。
原始程序这样做:
Dim br As BinaryReader = ...
Dim f_vb As Single = br.ReadSingle
Java 是大端,所以我在转换为浮点数之前反转字节。
RandomAccessFile raf = // ...
int i = raf.readInt();
int bigEndian = Integer.reverseBytes(i);
float f_java = Float.intBitsToFloat(bigEndian);
据我所知,f_vb
并f_java
包含相同的位。也就是说,BitConverter.ToInt32
onf_vb
和Float.floatToIntBits
(and floatToRawIntBits
) onf_java
给出相同的东西。但是,浮点数并不相等。例如,让bigEndian == 0x4969F52F
. Java 会报告958290.94
,VB.NET 会报告958290.938
。我猜这是因为 JVM 和 CLR 处理浮点数的方式不同,但我对浮点问题了解得不够多,无法找出原因。这种精度的损失正在造成麻烦,所以我想确定来源。