2

我有一个浮点数存储在二进制文件 0.9999833107 中。当我读取其中的数字时,它会被截断或扩展,具体取决于我是使用浮点数还是双精度数来存储它。我用以下代码读入二进制文件:

public double readFloat(RandomAccessFile fp){

    byte[] data = new byte[4];

    try {

        data[0] = fp.readByte();
        data[1] = fp.readByte();
        data[2] = fp.readByte();
        data[3] = fp.readByte();

    } catch (IOException e) {
            e.printStackTrace();
            return 0;
    }

    ByteBuffer buffer = ByteBuffer.wrap(data);

    return buffer.getDouble();
}

此方法返回 0.9999833106994629。当我将方法更改为输出浮点数时,返回的值为 0.9999833。有谁知道如何获取写入文件的数字?

4

1 回答 1

3

如果您只存储 4 个字节,则可能只有 9 个保证有效数字的准确性,因为 32 位内只有 4294967296 个值可表示 - 并且假设您可以将所有位用作尾数,而没有任何指数或符号.

我认为这更有可能最初是一个“接近” 0.9999833107 的值,表示为 a double,然后截断为 afloat进行存储。请注意,0.9999833107 本身不能完全存储为double- 最接近的 double 值是 0.9999833107000000165243136507342569530010223388671875。

换句话说,当您将其作为 a 读取时,float获得“写入文件的数字”。它可能不是转换存储之前的数字,但它是实际写入文件的数字。

于 2012-10-11T21:44:12.027 回答