私は、このように作成Doubleています浮動小数点数の追加桁を表示する方法は?
Double d = Double.parseDouble("27.86753"); // All the digits of this double value are 27.867530822753906
この特定の二もフロートで表現することができるので、Javaは私の数字の残りの部分を削除します。 Javaに、この値の真の二重表現(すべての桁)を強制的に与えるようにするにはどうすればよいですか?
私は、このように作成Doubleています浮動小数点数の追加桁を表示する方法は?
Double d = Double.parseDouble("27.86753"); // All the digits of this double value are 27.867530822753906
この特定の二もフロートで表現することができるので、Javaは私の数字の残りの部分を削除します。 Javaに、この値の真の二重表現(すべての桁)を強制的に与えるようにするにはどうすればよいですか?
ああ、面白いです。 double
が正確にどのようにを行うのかを正確に知りたいとします。
私はBigDecimal
を正確に指定された精度を持つ数を表しているのでnew BigDecimal(double).toString()
は、あなたの間違った数字のすべてを与えるだろうと思います。
編集:ああ、私は何が起こっているのか分かります。
は私はこのようにそれを説明してみましょう:Double.toString
はDouble.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のように。
これは私に数字の束(27.867529999999998580051396857015788555145263671875)を与えますが、私が探しているのIEEE 754倍値27.867530822753906ではありません。 – ubiquibacon
あなたはどこから他の価値を得ていますか?私はこれについてBigDecimalを信用することを強く期待しています。 –
郵便番号。そのリンクはJava Doubleクラスのページに移動します。あなたが何を参照しているか分からない。更新:私は今あなたの混乱を理解していると思います。 –
java.math.BigDecimal
を使用すると、スケールと丸めルールを明示的に制御することができます。あなたはダブルでそれをすることはできません。
醜いが、それは動作します:
Double d = Double.parseDouble(Double.toString(Float.parseFloat("27.86753"))); // Sets the value of the Double to 27.867530822753906
私は今何がうまくいかないかを見ます。 –
(これはあなたが望むものではありません、FYI) –
これは実際に私が望んでいたものですが、ほとんどの人が望むものではありません。もしあなたが本当にルイの答えを二重にしたいなら。私の答えは浮動小数点数の32ビット表現しか提供しません。 – ubiquibacon
は、あなたがこの考え出し持っていますか? –