web-dev-qa-db-fra.com

Arrondir les valeurs Bigdecimal avec 2 décimales

Je veux une fonction à convertir Bigdecimal10.12 for 10.12345 et 10.13 for 10.12556. Mais aucune fonction ne satisfait les deux conversions en même temps. Aidez-nous à y parvenir.

Ci-dessous est ce que j'ai essayé.
Avec la valeur 10.12345:

BigDecimal a = new BigDecimal("10.12345");

a.setScale(2, BigDecimal.ROUND_UP)
a.setScale(2, BigDecimal.ROUND_CEILING)
a.setScale(2, BigDecimal.ROUND_DOWN)
a.setScale(2, BigDecimal.ROUND_FLOOR)
a.setScale(2, BigDecimal.ROUND_HALF_DOWN)
a.setScale(2, BigDecimal.ROUND_HALF_EVEN)
a.setScale(2, BigDecimal.ROUND_HALF_UP)

Sortie:

10.12345::10.13
10.12345::10.13
10.12345::10.12
10.12345::10.12
10.12345::10.12
10.12345::10.12
10.12345::10.12

Avec valeur 10.12556:

BigDecimal b = new BigDecimal("10.12556");

b.setScale(2, BigDecimal.ROUND_UP)
b.setScale(2, BigDecimal.ROUND_CEILING)
b.setScale(2, BigDecimal.ROUND_DOWN)
b.setScale(2, BigDecimal.ROUND_FLOOR)
b.setScale(2, BigDecimal.ROUND_HALF_DOWN)
b.setScale(2, BigDecimal.ROUND_HALF_EVEN)
b.setScale(2, BigDecimal.ROUND_HALF_UP)

Sortie:

10.12556::10.13
10.12556::10.13
10.12556::10.12
10.12556::10.12
10.12556::10.12
10.12556::10.12
10.12556::10.12
28
sunleo

Je pense que le RoundingMode que vous recherchez est ROUND_HALF_EVEN. De le javadoc :

Mode d'arrondi pour arrondir vers le "voisin le plus proche" à moins que les deux voisins ne soient équidistants, auquel cas arrondir vers le voisin pair. Se comporte comme pour ROUND_HALF_UP si le chiffre à gauche de la fraction écartée est impair. se comporte comme pour ROUND_HALF_DOWN si c'est pair. Notez qu'il s'agit du mode d'arrondi qui minimise les erreurs cumulatives lorsqu'il est appliqué de manière répétée sur une séquence de calculs.

Voici un cas de test rapide:

BigDecimal a = new BigDecimal("10.12345");
BigDecimal b = new BigDecimal("10.12556");

a = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
b = b.setScale(2, BigDecimal.ROUND_HALF_EVEN);

System.out.println(a);
System.out.println(b);

Imprime correctement:

10.12
10.13
44
Florent Bayle

Ajoutez d'abord 0.001 Au numéro, puis appelez setScale(2, RoundingMode.ROUND_HALF_UP)

Exemple de code:

public static void main(String[] args) {
    BigDecimal a = new BigDecimal("10.12445").add(new BigDecimal("0.001"));
    BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_UP);
    System.out.println(b);
}
12
Erwin Bolwidt

Vous pouvez appeler la méthode setScale(newScale, roundingMode) trois fois en modifiant la valeur newScale de 4 à 3 en 2 comme

Premier cas

    BigDecimal a = new BigDecimal("10.12345");

    a = a.setScale(4, BigDecimal.ROUND_HALF_UP); 
    System.out.println("" + a); //10.1235
    a = a.setScale(3, BigDecimal.ROUND_HALF_UP); 
    System.out.println("" + a); //10.124
    a = a.setScale(2, BigDecimal.ROUND_HALF_UP);
    System.out.println("" + a); //10.12

Deuxième cas

    BigDecimal a = new BigDecimal("10.12556");

    a = a.setScale(4, BigDecimal.ROUND_HALF_UP); 
    System.out.println("" + a); //10.1256
    a = a.setScale(3, BigDecimal.ROUND_HALF_UP); 
    System.out.println("" + a); //10.126
    a = a.setScale(2, BigDecimal.ROUND_HALF_UP);
    System.out.println("" + a); //10.13
2
Arjit

Vous pouvez essayer ceci:

public static void main(String[] args) {
    BigDecimal a = new BigDecimal("10.12345");
    System.out.println(toPrecision(a, 2));
}

private static BigDecimal toPrecision(BigDecimal dec, int precision) {
    String plain = dec.movePointRight(precision).toPlainString();
    return new BigDecimal(plain.substring(0, plain.indexOf("."))).movePointLeft(precision);
}

SORTIE:

10.12
1
Harmlezz