値が の場合200.3456
、 にフォーマットする必要があります200.34
。 の場合200
、 にフォーマットする必要があります200.00
。
ベストアンサー1
これは、double を指定された小数点以下の桁数に丸める(切り捨てるのではなく)ユーティリティです。
例えば:
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)
スロインこれを指摘していただきありがとうございます。
私は何年もの間、上記の方法を使って「それほど大きくない」倍精度数を小数点以下 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:ジョシュア・ブロック著「 Effective Java (第 2 版)」の「正確な回答が必要な場合は、
float
と を避ける」double
- すべてのプログラマが浮動小数点演算について知っておくべきこと
厳密に数値を丸める代わりに(またはそれに加えて)文字列の書式設定が必要な場合は、他の回答を参照してください。
特に、round(200, 0)
が を返すことに注意してください。「 200.00200.0
」を出力したい場合は、まず丸めてから結果を出力用にフォーマットする必要があります(これはジェスパーの答え)。