[解決済み] doubleを小数点以下2桁に丸める[重複]。
質問
もし値が
200.3456
にフォーマットされる必要があります。
200.34
.
もし、それが
200
であれば、それは
200.00
.
解決方法は?
以下のようなユーティリティがあります。 ラウンド (代わりに 切り捨て ) を、指定された小数点以下の桁数で表示します。
例えば
round(200.3456, 2); // returns 200.35
オリジナル版:これに気をつけろ
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
これは
がひどく壊れる
は、小数点以下の桁数が非常に多い場合(たとえば
round(1000.0d, 17)
) または大きな整数部 (例.
round(90080070060.1d, 9)
). おかげさまで
スロイン
ご指摘をいただきました。
私は何年も前から、quot;not so big" doubleを小数点以下2、3桁に丸めるのに使っています(例えば、ロギング用に秒単位の時間をクリーンアップする場合: 27.987654321987 -> 27.99 )。しかし、より信頼性の高い方法がすぐに利用でき、コードもよりきれいになるので、これを避けるのが最善だと思います。
だから、代わりにこれを使う
(からの転用です。 ルイス・ワッセルマン氏による回答 と ショーン・オウエンの作品 .)
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
なお
HALF_UP
は、学校でよく習う丸めモードです。を熟読してください。
RoundingModeのドキュメント
のような他のものが必要だと思われる場合。
銀行員丸め
.
もちろん、お望みであれば、上記をインライン化してワンライナーにすることも可能です。
new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()
また、どのような場合でも
を使用した浮動小数点表現は、常に
float
と
double
は
不正確
.
例えば、次のような表現を考えてみましょう。
999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001
正確さを求めるならBigDecimalを使いたい . そして、その間に、Stringを受け取るコンストラクタを使い、doubleを受け取るコンストラクタは使わないでください。例えば、次のように実行してみてください。
System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));
このトピックに関する優れた参考文献をいくつかご紹介します。
-
項目48:"避ける
float
とdouble
正確な回答が必要な場合は 効果的なJava (第2版) ジョシュア・ブロッホ著 - 浮動小数点演算についてプログラマが知っておくべきこと
文字列が必要な場合 書式設定 数字を厳密に丸める代わりに(あるいはそれに加えて)、他の回答を参照してください。
具体的には、以下のことに注意してください。
round(200, 0)
は以下を返します。
200.0
. もし、" を出力したい場合。
200.00
は、まず丸め、その結果をフォーマットして出力する必要があります(これについては
Jesperの回答
).
関連
-
java.util.NoSuchElementException 原因解析と解決方法
-
java の例外が発生しました java
-
Methodのinvokeメソッド実装のJavaリフレクション
-
HttpClientがGZIP形式でない場合の対処法
-
ローカルリソースのロードが許可されていない場合の解決策
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
linux run jarfile Invalid or corrupt jarfile error.
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
IDEA パッケージステートメントの欠落
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み】Double値を小数点以下2桁に書式設定する最適な方法【重複あり
-
[解決済み] Android - 小数点以下2桁に丸める [重複]。