Quel mode d'arrondi utiliser pour la manipulation de devises en java?


J'ai lu sur le site java pour utiliser BigDecimal pour les devises. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Mais avec quel mode d'arrondi devrions-nous utiliser? lequel est le plus approprié et le plus largement nous

Author: Aaron Digulla, 2011-11-21

5 answers

Il n'y a pas de mode "correct", cela dépend de l'analyse de rentabilisation. Exemples:

  • Lors du calcul des impôts annuels, les fractions sont souvent coupées (RoundingMode.FLOOR).
  • Lors du calcul d'un bonus, vous pouvez toujours arrondir en faveur du client (RoundingMode.CEILING).
  • Pour les taxes sur une facture, vous arrondissez généralement HALF_UP
  • Lorsque vous faites des simulations financières complexes, vous ne voulez pas arrondir du tout.

Le documentation de RoundingMode contient beaucoup d'exemples comment fonctionnent les différents modes.

Pour obtenir une meilleure réponse, vous devez nous dire ce que vous voulez réaliser.

Cela dit, BigDecimal est le type correct à utiliser en Java car il peut préserver n'importe quelle précision et vous permet de choisir le mode d'arrondi le plus adapté à votre cas.

 45
Author: Aaron Digulla, 2011-11-21 08:25:25

La Plupart du temps BigDecimal est le seul choix valable pour les devises. Mais le choix de la stratégie d'arrondi n'est pas si évident.

La valeur par défaut est HALF_EVEN ce qui se trouve être un bon choix. Cet algorithme est connu comme banquiers arrondi (voir la discussion ici).

Une autre stratégie commune est HALF_UP qui est plus intuitive mais a des caractéristiques statistiques légèrement pires.

Notez également que dans de nombreux cas (en particulier dans les banques et assurances) la stratégie d'arrondi sera dictée par les exigences de l'entreprise, souvent différentes selon les cas d'utilisation.

 17
Author: Tomasz Nurkiewicz, 2011-11-21 08:26:41

Typiquement, vous utiliseriez l'arrondi "half up", comme ceci:

myBigDecimal.setScale(2, RoundingMode.HALF_UP);

De cette façon, vous arrondirez à deux décimales (que la plupart des devises utilisent, par exemple les dollars et les cents, il y a évidemment des exceptions), et vous arrondirez les valeurs de telle sorte qu'un demi-cent ou plus arrondira tandis que moins d'un demi-cent arrondira vers le bas. Voirle javadoc pour plus de détails.

 10
Author: Amos M. Carpenter, 2011-11-21 08:21:15

Pour les applications financières ROUND_HALF_EVEN est le mode d'arrondi le plus courant. Ce mode évite les biais. Mais pour l'affichage, vous devez utiliser la classe NumberFormat. Cette classe s'occupera des problèmes de localisation pour les montants dans différentes devises. Mais NumberFormat accepte uniquement les primitives. Utilisez donc le dernier si vous pouvez accepter un petit changement de précision dans les transformations en un double.

 4
Author: Sqeezer, 2011-11-21 08:28:27

Vous ne devez jamais utiliser un type décimal pour les devises. Utilisez un type entier. Cela maintient la précision d'achat en évitant l'erreur d'arrondi associée aux flotteurs

Lorsque vous affichez un montant, divisez-le par le facteur approprié pour obtenir la partie non intégrale.

 -8
Author: Brett Walker, 2011-11-21 08:14:49