2012-02-06 8 views
1

私は、このように作成Doubleています浮動小数点数の追加桁を表示する方法は?

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

この特定の二もフロートで表現することができるので、Javaは私の数字の残りの部分を削除します。 Javaに、この値の真の二重表現(すべての桁)を強制的に与えるようにするにはどうすればよいですか?

+0

は、あなたがこの考え出し持っていますか? –

答えて

5

ああ、面白いです。 doubleが正確にどのようにを行うのかを正確に知りたいとします。

私はBigDecimalを正確に指定された精度を持つ数を表しているのでnew BigDecimal(double).toString()は、あなたの間違った数字のすべてを与えるだろうと思います。

編集:ああ、私は何が起こっているのか分かります。

は私はこのようにそれを説明してみましょう:Double.toStringDouble.parseDoubleがまったく同じdouble返されるような少なくとも正確なString返します - 実際の値が、正確なIEEE 754値を「一意に識別する」だけ十分な桁数を印刷される桁数よりも多くの桁数を持つことがあります。 Double.toStringが期待したほどの桁数を与えていないからといって、実際の IEEE 754倍精度値がその桁数に丸められているわけではありません。 new BigDecimal(double).toStringは、格納されている正確なIEEE-754値を返します。

UPDATE:

何が起こっているが、それは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のように。

+0

これは私に数字の束(27.867529999999998580051396857015788555145263671875)を与えますが、私が探しているのIEEE 754倍値27.867530822753906ではありません。 – ubiquibacon

+0

あなたはどこから他の価値を得ていますか?私はこれについてBigDecimalを信用することを強く期待しています。 –

+0

郵便番号。そのリンクはJava Doubleクラスのページに移動します。あなたが何を参照しているか分からない。更新:私は今あなたの混乱を理解していると思います。 –

1

java.math.BigDecimalを使用すると、スケールと丸めルールを明示的に制御することができます。あなたはダブルでそれをすることはできません。

0

醜いが、それは動作します:

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

私は今何がうまくいかないかを見ます。 –

+0

(これはあなたが望むものではありません、FYI) –

+0

これは実際に私が望んでいたものですが、ほとんどの人が望むものではありません。もしあなたが本当にルイの答えを二重にしたいなら。私の答えは浮動小数点数の32ビット表現しか提供しません。 – ubiquibacon

関連する問題