Quelle est la différence entre ces deux appel? (Y en a-t-il?)BigDecimal setScale et rond
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
Quelle est la différence entre ces deux appel? (Y en a-t-il?)BigDecimal setScale et rond
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
Un point important qui est fait allusion, mais pas directement abordé est la différence entre « précision » et « échelle » et comment ils sont utilisés dans les deux déclarations. "precision" 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 en tant qu'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 un endroit à la droite, la différence deviendra clair:
// 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
Re: "" precision "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. –
Voir: "precision": Le nombre de chiffres commence à partir du chiffre non-zéro le plus à gauche du résultat exact. https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html – Eddy
si "précision est le nombre de chiffres significatifs" que pourquoi la précision de 0.0000009 arrive à 2? il devrait être 1 –
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. Voilà ma note à ce sujet sur mon blog:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
en dehors des réponses acceptées ci-dessous - setScale() crée un nouvel objet de BigDecimal - étant donné sa une classe immuable – prash
@prash La méthode 'round' renvoie également une nouvelle instance de BigDecimal car, comme vous l'avez dit, les instances sont immuables. – megaflop