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

ubi*_*con 1 java floating-point double

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

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

这个特殊的double也可以用float表示,所以Java会删除其余的数字.我如何强制Java给我这个值的真正双重表示(所有数字)?

Lou*_*man 5

哦,伙计,有趣.您想要确切地了解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,它实际上在内部比你引用的数字准确的值作为正确的答案27.867530822753906.这只是因为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);
Run Code Online (Sandbox Code Playgroud)

}

它打印出来了

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")
Run Code Online (Sandbox Code Playgroud)

实际上,第二个值明显接近27.86753,比例为0.0000008.