Java 正在尝试将双精度数字转换为十进制
我想把双精度数字转换成十进制。 例如,双精度数字22和字节数为:Java 正在尝试将双精度数字转换为十进制,java,double-precision,Java,Double Precision,我想把双精度数字转换成十进制。 例如,双精度数字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 这个号码是多少?请帮帮
[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
现在,我应该如何将双精度转换为数字以再次得到22?所有这些答案都是错误的我不确定您正试图进行哪种转换(当您说“转换为十进制”时,您希望的输出格式/类别是什么?)
然而,我读标题的第一个想法是a将是一个有效的表示。因此,第一种方法是执行以下操作:
double d = ...; // your input number
BigDecimal b = new BigDecimal(d);
这就是说,如果您想转换为十进制,那么这可能是因为d
的值存在浮点ponit/舍入问题,在基于d
构建时,BigDecimal
表示仍将存在此问题
解决这一问题的最佳方法是从一开始就使用BigDecimals
,使用它们的String
构造函数,这样就不会有任何浮点舍入实例。如果出于任何原因这不是一个选项,您可以将double
转换为字符串,这样可以解决许多浮点舍入问题:
String strRep = Double.toString(d);
BigDecimal b = new BigDecimal(strRep);
您可以编写简单的测试(使用JUnit):
如果这样做有效-检查22的字节表示是否正确(正确的表示将在位变量处)。这是4.67*10的18次方。但它完全不存在!其中是22:((你需要更具体地说明你想要转换什么。你能给我们一个完整的例子说明你想要做什么吗?我不明白你想要做什么。一个double是64位长(8字节),所以我真的不明白你的问题。如果你有一个double,你想要一个长doo
longl=(长)d
@melisazand:one byte=8位。64位=8位。本打算指出String
作为保持精度的一种方法,但你比我强!回答得好。
double initial = 22.0;
long bits = Double.doubleToLongBits(initial);
double converted = Double.longBitsToDouble(bits);
assertEquals(Double.valueOf(initial), Double.valueOf(converted));