2

浮動小数点数をバイナリファイル0.9999833107に保存しています。数値を読み取ると、floatを使用するか、doubleを使用して格納するかに応じて、切り捨てまたは拡張されます。私は次のコードでバイナリを読みました:

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バイトしか格納していない場合、32ビット内で表現できる有効数字は4294967296しかないため、有効数字が9桁しか保証されない可能性があります。これは、すべてのビットを仮数として使用でき、指数や符号は何もないことを前提としています。 。

これは元々0.9999833107に「近い」値であり、として表され、その後、ストレージ用doubleに切り捨てられた可能性がはるかに高いと思います。float0.9999833107自体を正確に-として格納することはできないことに注意してくださいdouble-それに最も近いdouble値は0.9999833107000000165243136507342569530010223388671875です。

言い換えれば、それをaとして読み取ると、float「ファイルに書き込まれた番号」が表示されますストレージに変換する前の数値ではなかった可能性がありますが、実際にファイルに書き込まれた数値です。

于 2012-10-11T21:44:12.027 に答える