2

我正在尝试将双精度数转换为十进制。例如,双精度数字 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 双精度:

任何存储为双精度值的值都需要 64 位,格式如下表所示:

63 符号(0 = 正,1 = 负)

62 到 52 指数,偏差 1023

51 到 0 数字 1.f 的分数 f

现在我应该如何将双精度转换为数字以再次获得 22?所有这些答案都是错误的

4

2 回答 2

2

我不确定您要进行哪种转换(当您说“转换为十进制”时,您想要的输出格式/类是什么?

但是,我阅读标题的第一个想法是BigDecimal将是一个有效的表示。因此,第一种方法是执行以下操作:

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

也就是说,如果您想转换为十进制,那么这可能是因为 的值存在浮动点/舍入问题d,它仍然会出现在BigDecimal表示中,因为它是基于 构建的d

解决这个问题的最佳方法是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 回答