Ensemble BigDecimalÉchelle et rond

140

Quelle est la différence entre ces deux appels? (Y a-t-il?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
utilisateur
la source
6
en dehors des réponses acceptées ci-dessous - setScale () crée un nouvel objet de BigDecimal - étant donné qu'il s'agit d'une classe immuable
prash
9
@prash la roundméthode renvoie également une nouvelle instance de BigDecimal car, comme vous l'avez dit, les instances sont immuables.
daiscog

Réponses:

212

Un point important auquel on fait allusion mais qui n'est pas directement abordé est la différence entre «précision» et «échelle» et comment ils sont utilisés dans les deux énoncés. «précision» est le nombre total de chiffres significatifs dans un nombre. «échelle» est le nombre de chiffres à droite de la virgule décimale.

Le constructeur MathContext n'accepte que la précision et RoundingMode comme arguments et, par conséquent, l'échelle n'est jamais spécifiée dans la première instruction.

setScale() accepte évidemment l'échelle comme argument, ainsi que RoundingMode, mais la précision n'est jamais spécifiée dans la deuxième instruction.

Si vous déplacez la virgule décimale d'une place vers la droite, la différence deviendra claire:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456
Dale Peters
la source
38
Re: "" précision "est le nombre total de chiffres dans un nombre." Non. La précision est le nombre de chiffres significatifs. La précision de 0,000042M est de 2.
David J.
2
Voir: "précision": le nombre de chiffres commence à partir du chiffre différent de zéro le plus à gauche du résultat exact. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy
si "La précision est le nombre de chiffres significatifs", pourquoi la précision de 0,0000009 est-elle égale à 2? il devrait être 1
Sanchi Girotra
1
Comment la valeur de votre BigDecimal est-elle définie? Comment sortez-vous la valeur (l'utilisation d'un String.format () peut masquer des chiffres significatifs)?
dale peters
1
@SanchiGirotra La précision est "le nombre de chiffres dans la valeur non mise à l'échelle". Une précision de 2 avec une valeur non mise à l' échelle de 90 et une échelle de 8 donne 0,0000009. Tout comme une précision de 1, une valeur non mise à l'échelle de 9 et une échelle de 7.
daiscog
52

Il y a en effet une grande différence que vous devez garder à l'esprit. setScale définit vraiment l'échelle de votre nombre alors que round arrondit votre nombre aux chiffres spécifiés MAIS il "commence à partir du chiffre le plus à gauche du résultat exact" comme mentionné dans le jdk. Donc, en ce qui concerne votre échantillon, les résultats sont les mêmes, mais essayez plutôt 0,0034. Voici ma note à ce sujet sur mon blog:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

user817756
la source