6

メソッドを使用して double をフォーマットすると、doubletoStringの完全な精度が得られます。例 ( Scala構文を使用):

java.text.MessageFormat.format ("{0}", Math.PI.toString)

以下を含む文字列になります。

3.141592653589793

ただし、この値はローカライズされていません。double 値を boxed として渡すと、次のようになりDoubleます。

java.text.MessageFormat.format ("{0}", Math.PI.asInstanceOf[AnyRef])

(AnyRefJavaと同等の Scala 型です)場合、結果は精度が切り捨てられたローカライズされた文字列になります。Object

3.142

書式文字列にさらにヒントを追加しても、結果は同じです。

java.text.MessageFormat.format ("{0,number}", Math.PI.asInstanceOf[AnyRef])

カスタム形式を指定することで、完全な精度を得ることができます。

java.text.MessageFormat.format ("{0,number,#.###############}", Math.PI.asInstanceOf[AnyRef])

ただし、これには double の大きさと精度に関するある程度の知識が必要です。( Piだけでなく) double 値を出力していて、値の完全な精度を保持したい場合、このアプローチは、書式文字列を動的に変更する必要があることを意味します。 ) フォーマット文字列は、実際にはリソース バンドルから取得されます。

たとえば、 の double 値を考えてみましょう1.0e37。最初に文字列に変換し、フォーマット文字列として "{0}" を使用すると、適切ではあるがローカライズされていない文字列値になります1.0E37。これをDouble"{0,number}" の書式文字列でボックス化して渡すと、ばかげた値が得られます10,000,000,000,000,000,000,000,000,000,000,000,000

要するに、最初に double を文字列に変換せずに double の完全な精度を維持するフォーマット文字列を見つけることができないようです。これは、ペストのように避けたいものです。double の完全な精度をローカライズされた値として出力する数値書式文字列はありますか?

更新

double を文字列に変換する必要がない理由を明確にするために:

  • toString私が知る限り、有効なJava double リテラル値を返します。文字列として、結果は に渡されるときにローカライズされませんMessageFormat.format。たとえば、 value のローカライズされた形式を出力したいとします1234.567toStringを返し"1234.567"MessageFormat.formatそのままにしておきます。罰金。私は自分の精密出力を持っています。ただし、ドイツでは、これは"1.234,567". 米国/英国でも、これは"1,234.567".
  • boxed IntegerBoolean、またはその他の非浮動小数点プリミティブ型をMessageFormat.format(単純な "{ n }" 形式で) に渡すと、適切にローカライズされた完全精度の出力が得られます。ローカライズされた出力が失われるため、最初にこれらの値を文字列に変換する必要はありません。これは、double (および float とBigDecimals) を別の方法で処理し、それらを に渡す前に文字列に変換する必要があることを意味しMessageFormat.formatます。(さらに、毎回それを忘れずに行う必要があります。)
4

2 に答える 2

0

MessageFormat はローカライズされた表現を使用し、桁区切り記号や小数点のカンマなどを使用します。あなたの使用法では、プラットフォームのデフォルトのロケールを使用します。

普遍的なプログラマーの表記法である valueOf/toString とは別のものを保持する必要があります。

double10 進数表現は double が内部的に存在する 2 のべき乗の合計の近似であるため、 andの使用precisionは少し矛盾した表現です。

完全な情報を保持するには、 Double.doubleToRawLongBitsを使用して生のビットをテキスト形式で保存し、戻ることができlongBitsToDoubleます。

double x = Math.PI;
String repr = String.format("%016x", Double.doubleToRawLongBits(x));
x = Double.longBitsToDouble(Long.valueOf(repr, 16));
于 2014-09-23T14:05:14.753 に答える
-1

Java の double 形式は 64 ビットで表され、仮数には 52 ビットが使用されます。ログ (2 52 ) = 15.65355977。これは、Double の精度がおよそ 15 ~ 16 桁であることを意味します。

結果3.141592653589793は、Double から得られるほぼすべてのものだと思います。

于 2014-09-23T12:53:09.360 に答える