【问题标题】:Convert Double to Binary representation?将 Double 转换为二进制表示?
【发布时间】:2011-09-15 15:13:48
【问题描述】:

我尝试将 double 转换为其二进制表示,但使用 Long.toBinaryString(Double.doubleToRawLongBits(d)) 并没有帮助,因为我有大量数字,Long 无法存储它们,即 2^900

【问题讨论】:

  • 二进制表示只能是 64 位,只要 double 是 64 位。我不知道 2^900 是从哪里来的。
  • 只是出于好奇,您在开发什么样的应用程序才能处理这么大的数字?
  • 我必须做一些实验来对这些可能性进行抽样,但我发现我需要进行随机抽样!

标签: java binary double type-conversion long-integer


【解决方案1】:

这是一个小sn-p,它将双精度的小数部分转换为二进制格式:

String convertToBinary(double number) {
    int i=1;
    String num="0.";
    double temp,noofbits=32;
    while (i<=noofbits && number>0) {
        number=number*2;
        temp=Math.floor(number);
        num+=(int)temp;
        number=number-temp;
        i++;
    }

其中 noofbits 给出了您希望将小数部分限制为的位大小。 对于整数部分,直接使用 Integer.toBinaryString() 以及 double 的下限值并附加到小数二进制字符串。

【讨论】:

    【解决方案2】:

    您可能想要处理整体和小数部分:

    public String toBinary(double d, int precision) {
        long wholePart = (long) d;
        return wholeToBinary(wholePart) + '.' + fractionalToBinary(d - wholePart, precision);
    }
    
    private String wholeToBinary(long l) {
        return Long.toBinaryString(l);
    }
    
    private String fractionalToBinary(double num, int precision) {
        StringBuilder binary = new StringBuilder();
        while (num > 0 && binary.length() < precision) {
            double r = num * 2;
            if (r >= 1) {
                binary.append(1);
                num = r - 1;
            } else {
                binary.append(0);
                num = r;
            }
        }
        return binary.toString();
    }
    

    【讨论】:

      【解决方案3】:

      Long.toBinaryString(Double.doubleToRawLongBits(d)) 似乎工作得很好。

      System.out.println("0:                0b" + Long.toBinaryString(Double.doubleToRawLongBits(0D)));
      System.out.println("1:                0b" + Long.toBinaryString(Double.doubleToRawLongBits(1D)));
      System.out.println("2:                0b" + Long.toBinaryString(Double.doubleToRawLongBits(2D)));
      System.out.println("2^900:            0b" + Long.toBinaryString(Double.doubleToRawLongBits(Math.pow(2, 900))));
      System.out.println("Double.MAX_VALUE: 0b" + Long.toBinaryString(Double.doubleToRawLongBits(Double.MAX_VALUE)));
      
      /*
          prints:
          0:                0b0
          1:                0b11111111110000000000000000000000000000000000000000000000000000
          2:                0b100000000000000000000000000000000000000000000000000000000000000
          2^900:            0b111100000110000000000000000000000000000000000000000000000000000
          Double.MAX_VALUE: 0b111111111101111111111111111111111111111111111111111111111111111
      */
      

      【讨论】:

      • @EricWang 你为什么不自己试试呢?
      • 缺少的第 63 位和第 64 位在哪里?
      【解决方案4】:

      您可以使用 Double.toHexString(d),然后使用 for 循环和 StringBuilder 将十六进制字符串转换为二进制字符串。

      【讨论】:

      • 谢谢,这可能有助于解决我的问题!
      【解决方案5】:

      您可以使用BigInteger 来保存您的大数,并使用BigInteger.toString() 方法来检索它的二进制表示。

      BigInteger bigNum = new BigInteger(sYourNum);
      System.out.println( bigNum.toString(2) );
      

      【讨论】:

        【解决方案6】:

        您是否尝试过使用java.math.BigInteger 并使用参数2 调用toString(int radix)

        【讨论】:

        • Double.doubleToRawLongBits(d) 只会返回 64 位 long
        • 顺便说一下,以上内容仅适用于整数——根据您提到的 2^900,我假设是这种情况?
        • 问题是我使用返回 double 的 Math.pow(2, 900) 计算它!
        • 是的,同意 :) 感谢大家的帮助!
        • @Peter:哈哈!我重复一遍,“所有双精度都是 64 位,所有双精度都是 64 位”... :-)
        猜你喜欢
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2017-12-16
        • 2014-12-28
        • 1970-01-01
        • 2021-07-12
        相关资源
        最近更新 更多