最近、数字を扱う仕事をしていて、データベースに保存されている値に応じて、2倍の値の精度を6桁または4桁に設定したいという状況がありました。
例えば、データベースで精度が4桁に設定されている場合、出力は次のようになります。
10.0000
.
DecimalFormatや文字列
##.####`を使ってみましたが、いちいち記号を使うのは面倒です。
何か良い方法はないでしょうか?例えば、以下のような方法です。
Double value = 10.0;
value.setPrecision(4);
浮動小数点値には10進数がないので、doubleの精度を10進数で指定することはできません。浮動小数点値には10進法の桁がなく,2進法の桁があるからです。
後で値をどうするかに応じて、BigDecimal
またはDecimalFormat
を使って10進数に変換する必要があります。
避けられない*100/100の回答に対する反論は、この質問に対する私の回答も参照してください。
doubleと
float`の精度は,そのサイズと,IEEE浮動小数点型の実装方法によって決まります。
一方,出力の小数点以下の桁数は,フォーマットの問題です。同じ定数を何度も入力するのは良くないというのはその通りです。代わりに文字列定数を宣言して,その記号表現を使うべきです。
private static final String DBL_FMT = "##.####";
記号表現を使えば、コードを検索することなく、定数が使われているすべての場所の精度を変更することができます。
EJPさんの話を補足すると、倍数を扱うときの'precision'の概念は非常に厄介です。https://stackoverflow.com/a/3730040/390153 で議論されているように、精度に関わらず0.1をdoubleとして表すことさえできません。同じ理由で、有限の精度を持つbase 10で1/3を表すこともできません。
自分が解決しようとしている問題を考えて、検討する必要があります。
a) そもそもdoubleを使うべきなのか。もし精度が重要な概念であれば、doubleを使うことは間違いかもしれません。
b) 倍率が適切な場合、精度とは何を意味するのか?もし、表示のことだけを考えているのであれば、ロジックを表示関数にまとめることで、一箇所で処理するだけで済むようになります。