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
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
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);
}
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
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