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