[英]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.