8

私のアプリは、Double.toString() が「-3.1999999999999953」を生成する double を生成していますが、「-3.2」を生成すると予想しています。

私は実際に JScience からこれらの double を取得していAmount#getEstimatedValue()ます。

桁数が何桁になるかわからないため、精度のために任意の桁数を設定したくありませんが、「99999999.*」で終わる数値を生成したくありません。

この問題なしに Double を String に変換するにはどうすればよいですか?

4

3 に答える 3

7

推奨される解決策

BigDecimal.valueOf (hisDouble).toPlainString ()

この投稿の最後のセクションで提供されたハックは、OP の質問を解決しようとしたときに最初に頭に浮かんだものでした。

その後、友人が私が何をしているのかを尋ね、OP を使用する方が良いと言い、BigDecimalfacepalm モードに入りました..

しかし、このハックをこの投稿に残して、世界が私が時々どれほど愚かであるかを理解できるようにします.


印刷するときに使用できますSystem.out.format

以下のスニペットは、 の値をyourDecimal小数点以下 1 桁に丸め、値を出力します。

Double yourDouble = -3.1999999999999953;
System.out.format ("%.1f", yourDouble);

出力

-3.2

これまでに書かれた最も愚かなハック

  public static String fixDecimal (Double d) {
    String  str = "" + d;
    int    nDot = str.indexOf ('.');

    if (nDot == -1)
      return str;

    for (int i = nDot, j=0, last ='?'; i < str.length (); ++i) {
      j = str.charAt (i) == last ? j+1 : 0;

      if (j > 3)
        return String.format ("%."+(i-nDot-j-1)+"f", d);

      last = str.charAt (i);
    }

    return str;
  }

...

Double[] testcases = {
  3.19999999999953,
  3.145963219488888,
  10.4511111112,
  100000.0
};

for (int i =0; i < testcases.length; ++i)
  System.out.println (
    fixDecimal (testcases[i]) + "\n"
  );

出力

3.2
3.1459632195
10.45
100000.0
于 2011-12-15T17:23:32.000 に答える
4

使用BigDecimal:

System.out.println(BigDecimal.valueOf(-3.2d).toPlainString());

出力:

-3.2
于 2011-12-15T17:26:55.817 に答える
3

あなたは試すことができます

http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html

やや「ヘビー級」ですが、うまくいくはずです。使用例:

DecimalFormat サブパターン境界が正しく機能しない

于 2011-12-15T17:23:21.143 に答える