有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何显示浮点数的附加数字?

我有一个Double是我这样创建的:

Double d = Double.parseDouble( "27.86753" ); // All the digits of this double value are 27.867530822753906

这个特殊的双精度也可以用浮点表示,所以Java会删除我的其余数字。如何强制Java给出这个值的真正的双精度表示(所有数字)


共 (3) 个答案

  1. # 1 楼答案

    哦,伙计,真有趣。您想确切地了解double如何不准确地执行

    我认为new BigDecimal(double).toString()会给出所有不正确的数字,因为BigDecimal表示具有精确指定精度的数字

    编辑:哦,我想我知道发生了什么

    让我试着这样解释:Double.toString返回最不精确的String,这样Double.parseDouble将返回完全相同的double足够的数字来“唯一地标识”准确的IEEE 754值,尽管实际值可能比打印的数字多。仅仅因为Double.toString没有给你期望的那么多数字并不意味着实际IEEE 754双精度值被舍入到那么多数字new BigDecimal(double).toString将返回存储的准确IEEE-754值

    更新:

    所发生的是,当它打印出27.86753时,它实际上在内部是一个比您引用的正确答案^{更精确的值。这仅仅是因为toString被设计成只打印尽可能多的内容,以确保Double.parseDouble(Double.toString(value))是不可操作的

    我运行了以下代码:

    public static void main(String[] args) {
      double dWithFloat = Double.parseDouble(Double.toString(Float.parseFloat("27.86753")));
      double dJustParsed = Double.parseDouble("27.86753");
      System.out.println(dWithFloat);
      System.out.println(dJustParsed);
    
      BigDecimal bigFromFloat = new BigDecimal(dWithFloat);
      BigDecimal bigJustParsed = new BigDecimal(dJustParsed);
      System.out.println(bigFromFloat); 
        // prints the exact value from the double,
        // doesn't round or truncate like Double.toString
      System.out.println(bigJustParsed);
    

    }

    然后打印出来

    27.867530822753906 // Double.toString(Double.parseDouble(Double.toString(Float.parseFloat("27.86753"))));
    27.86753 // Double.toString(Double.parseDouble("27.86753")) is indeed a no-op
    27.86753082275390625 // This is the _actual_ value from D.parseD(D.toString(F.parseF("27.86753")))
    27.867529999999998580051396857015788555145263671875 // This is the actual value from D.parseD("27.86753")
    

    事实上,第二个值明显接近27.86753,大约0.0000008

  2. # 2 楼答案

    您可能想考虑使用<强> ^ {}/St>您有明确的方法来控制比例和舍入规则。你不能用双份的

  3. # 3 楼答案

    丑陋但有效:

    Double d = Double.parseDouble( Double.toString( Float.parseFloat( "27.86753" ) ) ); // Sets the value of the Double to 27.867530822753906