LoginSignup
48
30

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-30

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 を導出する必要がある。それやるくらいだったら自分で頑張る。

48
30
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
30