web-dev-qa-db-fra.com

Java BigDecimal: arrondit à la valeur entière la plus proche

J'ai besoin des résultats suivants

100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

.round() ou .setScale()? Comment puis-je m'y prendre?

82
n a

Vous pouvez utiliser setScale() pour réduire le nombre de chiffres fractionnaires à zéro. En supposant que value contienne la valeur à arrondir:

BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);

Utiliser round() est un peu plus compliqué, car vous devez spécifier le nombre de chiffres à conserver. Dans vos exemples, cela serait 3, mais ce n'est pas valable pour toutes les valeurs:

BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);

(Notez que les objets BigDecimal sont immuables; setScale et round renverront un nouvel objet.)

139
Grodriguez

Si je vais par la réponse de Grodriguez

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

C'est la sortie

100.23 -> 100
100.77 -> 101

Ce qui n'est pas tout à fait ce que je veux, alors j'ai fini par le faire ..

System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);

C'est ce que je reçois

100.23 -> 100.00
100.77 -> 101.00

Cela résout mon problème pour le moment ..:) Merci à vous tous.

10
n a

Voici une solution extrêmement compliquée, mais qui fonctionne:

public static BigDecimal roundBigDecimal(final BigDecimal input){
    return input.round(
        new MathContext(
            input.toBigInteger().toString().length(),
            RoundingMode.HALF_UP
        )
    );
}

Code de test:

List<BigDecimal> bigDecimals =
    Arrays.asList(new BigDecimal("100.12"),
        new BigDecimal("100.44"),
        new BigDecimal("100.50"),
        new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
    System.out.println(roundBigDecimal(bd).toPlainString());
}

Sortie:

100
100
101
101

5

Il suffit de regarder:

http://download.Oracle.com/javase/6/docs/api/Java/math/BigDecimal.html#ROUND_HALF_UP

et:

setScale(int precision, int roundingMode)

Ou si vous utilisez Java 6, alors

http://download.Oracle.com/javase/6/docs/api/Java/math/RoundingMode.html#HALF_UP

http://download.Oracle.com/javase/6/docs/api/Java/math/MathContext.html

et soit:

setScale(int precision, RoundingMode mode);
round(MathContext mc);
3
toolkit

Je ne pense pas que vous puissiez arrondir comme ça en une seule commande. Essayer

    ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(new BigDecimal("100.12"));
    list.add(new BigDecimal("100.44"));
    list.add(new BigDecimal("100.50"));
    list.add(new BigDecimal("100.75"));

    for (BigDecimal bd : list){
        System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
    }

Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00

J'ai testé le reste de vos exemples et il renvoie les valeurs demandées, mais je ne garantis pas son exactitude.

0
Daniel Fath