java - 尝试将 double 转换为小数

标签 java double-precision

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

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

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

62 至 52 指数,偏差 1023

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

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

最佳答案

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

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

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

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

解决这个问题的最佳方法是从一开始就使用 BigDecimals,使用它们的 String 构造函数 - 这样就不会出现任何 float 实例 -点舍入。如果出于某种原因这不是一个选项,您可以将 double 转换为字符串,这样可以解决许多浮点舍入问题:

String strRep = Double.toString(d);
BigDecimal b = new BigDecimal(strRep);

关于java - 尝试将 double 转换为小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10849721/

相关文章:

java - 在android中创建用户时检查用户名可用性

java - 具有两个不同数据源问题的 Spring Batch

java - Netbeans 8.1 和 Java - 如何在显示主窗体后启用复选框

java - 这个简单的 'double' 计算有什么问题?

java - 在 Java 中比较 double 值是否相等。

c++ - c++ 中是否有使用 opencv 的函数允许将图像转换为 double ,如 MATLAB 中的 im2double?

java - Android DownloadManager 以原始名称保存文件

Java-多态性 : legal vs illegal declarations

C++ double 和舍入

java - 使用 DecimalFormat 格式化 Double 以在没有科学记数法的情况下打印