繁体   English   中英

将位转换为双精度后,如何在不使用 BigDecimal 的情况下存储实际的浮点/双精度值?

[英]After converting bits to Double, how to store actual float/double value without using BigDecimal?

根据几个浮点计算器以及我下面的代码,以下 32 位00111111010000000100000110001001的实际浮点值为 (0.750999987125396728515625)。 由于它是实际的 Float 值,我应该认为将其存储在 Double 或 Float 中会保留精度和精确值,只要(1)不执行算术(2)使用实际值和(3)值是没有被贬低。 那么为什么实际值与 (0.7509999871253967) 的强制转换(示例 1)和文字(示例 2)值不同?

我以这个计算器为例: https://www.h-schmidt.net/FloatConverter/IEEE754.html

在此处输入图像描述

import java.math.BigInteger;
import java.math.BigDecimal;

public class MyClass {
    public static void main(String args[]) {
      int myInteger = new BigInteger("00111111010000000100000110001001", 2).intValue();
      Double myDouble = (double) Float.intBitsToFloat(myInteger);
      String myBidDecimal = new BigDecimal(myDouble).toPlainString();

      System.out.println("      bits converted to integer: 00111111010000000100000110001001 = " + myInteger);
      System.out.println("    integer converted to double: " + myDouble);
      System.out.println(" double converted to BigDecimal: " + myBidDecimal);

      Double myDouble2 = 0.750999987125396728515625;
      String myBidDecimal2 = new BigDecimal(myDouble2).toPlainString();

      System.out.println("");
      System.out.println("       Ignore the binary string: ");
      System.out.println("            double from literal: " + myDouble2);
      System.out.println(" double converted to BigDecimal: " + myBidDecimal2);
    }
}

这是 output:

      bits converted to integer: 00111111010000000100000110001001 = 1061175689
    integer converted to double: 0.7509999871253967
 double converted to BigDecimal: 0.750999987125396728515625

       Ignore the binary string: 
            double from literal: 0.7509999871253967
 double converted to BigDecimal: 0.750999987125396728515625

没有实际的精度损失; 问题是您对如何将双打转换为String (例如打印时)的错误期望。

Double.toString的文档中

m 或 a 的小数部分必须打印多少位? 必须至少有一个数字来表示小数部分,除此之外,必须有尽可能多的数字,但仅能将参数值与相邻的 double 类型值区分开来。 也就是说,假设 x 是由该方法为有限非零参数 d 生成的十进制表示所表示的精确数学值。 那么 d 必须是最接近 x 的 double 值; 或者如果两个双精度值同样接近 x,则 d 必须是其中之一,并且 d 的有效位的最低有效位必须为 0。

因此,当一个double被打印时,它只打印了足够的数字来唯一标识该double值,而不是用将精确值描述为实数所需的位数。

如果您想获得具有所有可能数字的double精度值,那么new BigDecimal(theDouble).toPlainString()就是您的方法 - 而且,正如您所演示的,它会得到正确的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM