2

倍精度の数値を10進数に変換しようとしています。たとえば、倍精度でバイトとしての数値22は次のとおりです。

[0] 0
[1] 0
[2] 0
[3] 0
[4] 0
[5] 0
[6] 54
[7] 64

今、私はこれらの値を再び22に変換しようとします:

  ByteBuffer buffer = ByteBuffer.wrap(data);
  long l = buffer.getLong();
  long b = Double.doubleToLongBits(l);

しかし、結果は完全に間違っています:4.6688606E18 この数は何ですか?助けてください、私は完全に混乱しています!

倍精度のIEEE標準754に準拠:

doubleとして格納される値には、次の表に示すようにフォーマットされた64ビットが必要です。

63符号(0 =正、1 =負)

62から52の指数、1023でバイアス

数1の51から0の分数f

では、倍精度を数値に変換して22を再び取得するにはどうすればよいですか?これらの答えはすべて間違っています

4

2 に答える 2

2

あなたが行おうとしている変換の種類が正確にはわかりません(「10進数に変換」と言うとき、希望する出力形式/クラスは何ですか?)

しかし、タイトルを読んで最初に思ったのは、BigDecimalが有効な表現であるということでした。したがって、最初のアプローチは、次のようなことを行うことです。

double d = ...; // your input number
BigDecimal b = new BigDecimal(d);

つまり、10 進数に変換したい場合は、 の値に浮動小数/丸めの問題があり、に基づいて構築されているためd、表現にまだ存在するためと考えられます。BigDecimald

これを回避する最善の方法は、コンストラクターを使用BigDecimalsして最初から使用するStringことです。したがって、浮動小数点の丸めのインスタンスはありません。何らかの理由でこれがオプションでない場合は、double多くの浮動小数点の丸めの問題を考慮して、 を文字列に変換できます。

String strRep = Double.toString(d);
BigDecimal b = new BigDecimal(strRep);
于 2012-06-01T11:53:50.230 に答える
0

簡単なテストを(JUnitで)書くことができます:

double initial = 22.0;

long bits = Double.doubleToLongBits(initial);

double converted = Double.longBitsToDouble(bits);

assertEquals(Double.valueOf(initial), Double.valueOf(converted));

これが機能する場合は、22 の正しいバイト表現があることを確認してください (正しい表現はビット変数にあります)。

于 2012-06-01T12:31:42.280 に答える