1

我正在将最初用 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_vbf_java包含相同的位。也就是说,BitConverter.ToInt32onf_vbFloat.floatToIntBits(and floatToRawIntBits) onf_java给出相同的东西。但是,浮点数并不相等。例如,让bigEndian == 0x4969F52F. Java 会报告958290.94,VB.NET 会报告958290.938。我猜这是因为 JVM 和 CLR 处理浮点数的方式不同,但我对浮点问题了解得不够多,无法找出原因。这种精度的损失正在造成麻烦,所以我想确定来源。

4

1 回答 1

6

这些位表示的确切值是 958290.9375。可能是您在 Java 中使用的任何值显示“958290.94”,默认四舍五入到小数点后两位或八位有效数字,而您在 VB.NET 中使用的任何显示“958290.938”,默认四舍五入到小数点后三位或九位有效数字。或者,其中之一可能不擅长将浮点数转换为十进制以进行显示。

如果有显示更多数字的选项,请尝试它们。或者,构造值 958290.9375,从 f_java 中减去它,并测试结果是否正好为零。它应该是。

最接近 958290.9375 的单精度浮点数是 958290.875 和 958291。任何中途格式化程序都不能将它们显示为“958290.94”或“958290.938”,因此您拥有的浮点数不太可能是 958290.9375 以外的任何值。

于 2012-07-14T03:35:01.573 回答