Javaで数値をn桁に丸める方法 質問する

Javaで数値をn桁に丸める方法 質問する

私が欲しいのは、double を、半分切り上げ方式を使用して丸める文字列に変換する方法です。つまり、丸める小数が 5 の場合、常に次の数値に切り上げます。これは、ほとんどの状況でほとんどの人が期待する標準的な丸め方法です。

また、有効な数字のみを表示したいです。つまり、末尾のゼロは表示されません。

これを行う 1 つの方法は、次のString.format方法を使用することです。

String.format("%.5g%n", 0.912385);

戻り値:

0.91239

これは素晴らしいのですが、重要でない場合でも常に小数点以下 5 桁の数値が表示されます。

String.format("%.5g%n", 0.912300);

戻り値:

0.91230

別の方法としては、以下を使用しますDecimalFormatter

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

戻り値:

0.91238

しかし、ご覧のとおり、これは半偶数丸めを使用しています。つまり、前の数字が偶数の場合は切り捨てられます。私が欲しいのはこれです:

0.912385 -> 0.91239
0.912300 -> 0.9123

Java でこれを実現する最良の方法は何ですか?

ベストアンサー1

使用setRoundingMode、 をセットするRoundingMode半偶数ラウンドに関する問題を明示的に処理するには、必要な出力のフォーマット パターンを使用します。

例:

DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
    Double d = n.doubleValue();
    System.out.println(df.format(d));
}

出力は次のようになります:

12
123.1235
0.23
0.1
2341234.2125

編集: 元の回答では、double 値の精度については触れられていません。切り上げでも切り捨てでもあまり気にしないのであれば問題ありません。しかし、正確な丸めが必要な場合は、値の予想される精度を考慮する必要があります。浮動小数点値は、内部的にバイナリ表現を持ちます。つまり、2.7735 のような値は、実際には内部的にその正確な値を持つわけではありません。わずかに大きくなったり、わずかに小さくなったりすることがあります。内部値がわずかに小さい場合、2.7740 に切り上げられません。この状況を改善するには、作業している値の精度を認識し、丸める前にその値を加算または減算する必要があります。たとえば、値が 6 桁まで正確であることがわかっている場合、中間の値を切り上げるには、その精度を値に追加します。

Double d = n.doubleValue() + 1e-6;

切り捨てるには、精度を減算します。

おすすめ記事