Java の double を素直な String にしたい、E 要らない

  • 14
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Java でいろんな double を普通に文字列にするのが簡単にいかなかったのでメモ。限られた需要だと思うので今後参照するか微妙だが。

ゼロがいくら並んでもいいので、指数表記はやめて素直な文字列にして欲しい問題

最初に結論

BigDecimal#toPlainString() を使う:

double d1 = 0.00000000000000000000000000000000000000000123456789012345678901234567890d;
double d2 = 1234567890123456789012345678900000000000000000000000000000000000000000000d;
double d3 = 1234567890.1234567890123456789d;

System.out.println(BigDecimal.valueOf(d1).toPlainString());
// 0.0000000000000000000000000000000000000000012345678901234568
System.out.println(BigDecimal.valueOf(d2).toPlainString());
// 1234567890123456800000000000000000000000000000000000000000000000000000000
System.out.println(BigDecimal.valueOf(d3).toPlainString());
// 1234567890.1234567

注意点としては、コンストラクタ BigDecimal(double) は避けて、静的メソッドの BigDecimal.valueOf(double) を使う点。理由に関しては BigDecimal(double) のドキュメントを参照すること。

〜はダメなの?

↑に至るまでに試したこと

Double.toString(d) はダメ

掲題や冒頭でも書いたとおり、特定の条件で指数表記になってしまう。その条件に関してはドキュメントをみること。

Double.toString(double) の仕様: http://docs.oracle.com/javase/jp/8/docs/api/java/lang/Double.html#toString-double-

double d1 = 0.00000000000000000000000000000000000000000123456789012345678901234567890d;
double d2 = 1234567890123456789012345678900000000000000000000000000000000000000000000d;
double d3 = 1234567890.1234567890123456789d;

System.out.println(Double.toString(d1));
// 1.2345678901234568E-42
System.out.println(Double.toString(d2));
// 1.2345678901234568E72
System.out.println(Double.toString(d3));
// 1.2345678901234567E9

String.format("%f", d) もダメ

double のすべての桁を出力するには Formatter で書いてあるところの、width と precision を導出する必要がある。それやるくらいだったら自分で頑張る。