1. ホーム
  2. java

[解決済み] Javaで数値を小数点以下n桁に丸める方法

2022-03-17 12:10:44

質問

つまり、丸めるべき小数が5であれば、常に次の数に丸めるということです。これは、ほとんどの人がほとんどの状況で期待する丸めの標準的な方法です。

また、有効数字だけを表示してほしい。つまり、後ろに0をつけないようにしてほしい。

これを実現する一つの方法として 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でこれを実現するには、どのような方法がありますか?

どのように解決するのですか?

使用方法 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


EDIT : 元の回答では、2倍値の精度については触れていません。四捨五入されようがされまいがあまり気にしないのであればそれでいいのですが。しかし、もし正確な丸めをしたいのであれば、値の予想精度を考慮する必要があります。浮動小数点値は内部で2進数表現をしています。つまり、2.7735のような値は、実際には内部でその正確な値を持っているわけではありません。少し大きくなることもあれば、少し小さくなることもある。もし内部的な値がわずかに小さければ、2.7740に丸められないことになります。その状況を改善するためには、扱う値の精度を意識して、その値を足したり引いたりしてから丸める必要があります。例えば、6桁までの精度があることがわかっている場合、中途半端な値を切り上げるには、その精度を値に加算します。

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

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