Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在尝试将双精度数字转换为十进制_Java_Double Precision - Fatal编程技术网

Java 正在尝试将双精度数字转换为十进制

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 这个号码是多少?请帮帮

我想把双精度数字转换成十进制。 例如,双精度数字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

现在,我应该如何将双精度转换为数字以再次得到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));