倍精度数を小数点第2位に丸める [重複] 質問する

倍精度数を小数点第2位に丸める [重複] 質問する

値が の場合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")));

このトピックに関する優れた参考文献:


厳密に数値を丸める代わりに(またはそれに加えて)文字列の書式設定が必要な場合は、他の回答を参照してください。

特に、round(200, 0)が を返すことに注意してください。「 200.00200.0 」を出力したい場合は、まず丸めてから結果を出力用にフォーマットする必要があります(これはジェスパーの答え)。

おすすめ記事