簡體   English   中英

如何顯示浮點數的其他數字?

[英]How to display additional digits of a floating point number?

我有一個像這樣創建的Double

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

這個特殊的雙精度數也可以用浮點數表示,因此Java刪除了我其余的數字。 如何強制Java為該值提供真正的雙精度表示(所有數字)?

哦,伙計,有趣。 您想確切地了解它double准確。

我認為new BigDecimal(double).toString()將為您提供所有不正確的數字,因為BigDecimal表示具有精確指定精度的數字。

編輯:Ohhhhhhhh,我想我知道發生了什么事。

讓我試着解釋它是這樣的: 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);

}

然后打印出來

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。

您可能要考慮使用java.math.BigDecimal ,那里有明確的方法來控制縮放和舍入規則。 您無法使用Double做到這一點。

丑陋但可行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM