[解決済み] Javaで数値を小数点以下n桁に丸める方法
質問
つまり、丸めるべき小数が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;
切り捨てる場合は、精度を減算します。
関連
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
をインスタンス化することができません。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] doubleを小数点以下2桁に丸める[重複]。
-
[解決済み】javaで小数点以下2桁に丸める?[重複している]。