IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

BigDecimal et RoundingMode.HALF_EVEN


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut BigDecimal et RoundingMode.HALF_EVEN
    Bonjour,

    Je cherche à implementer le "banker' rounding" mode.

    Pour cela j'ai besoin d'arrondir vers le haut ou vers le bas dans la direction du chiffre pair le plus proche.

    Si je comprends bien la description du RoundingMode.HALF_EVEN c'est ce que cela devrait faire mais pourtant...avec ce petit test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BigDecimal nb = new BigDecimal("24.793338");
     
    System.out.println("nb = " + nb + " *** arrondi = " + nb.setScale(2, RoundingMode.HALF_EVEN));
    je devrais obtenir 29.80...mais j'obtiens 29.79...

    Merci de m'eclairer.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Par défaut
    Bonjour,
    Le résultat est normal : le premier paramètre de setScale est le nombre de chiffre après la virgule. Il faudrait donc 1 pour ce paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb.setScale(1, RoundingMode.HALF_EVEN)

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Par défaut
    Bonjour,

    voila j'ai voulu voir le problème de mes propre yeux est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BigDecimal nombre = new BigDecimal("29.79338");
    System.out.println("Nombre = "+nombre+" - arondi = "+nombre.setScale(2, RoundingMode.HALF_EVEN));
    output :

    Nombre = 29.79338 - arondi = 29.79
    et tu sure de ne rien faire d'autre ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut
    1. Je veux garder 2 décimales
    2. Non je ne fais rien d'autre

    Est-ce que ma comprehension du RoundingMode.HALF_EVEN est bien correcte : d'arrondir vers le haut ou vers le bas dans la direction du chiffre pair le plus proche. ?

    Quelques examples du résultat désiré :

    24.793338 --> 24.80
    54.1754 --> 54.18
    343.2050 --> 343.20
    106.2038 --> 106.20

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Non, normalement HALF_EVEN arrondit au plus proche, et en cas d'équidistance choisit le nombre pair.

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut
    Ah voilà mon erreur...

    Comment puis-je faire pour implémenter ce que je veux faire.

    Y a-t-il un Roung-ding mode pour cela ?
    Peut-être avec le MathContext ?

    Merci d'avance.

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Cela n'est pas possible par l'API directement dans BigDecimal.

    Ensuite, on peut imaginer une autre API qui le fasse, ou de le coder à la main ... mais ça semble curieux comme mode d'arrondissement.

  8. #8
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 254
    Par défaut
    C'est un mode qui permet de limiter l'impact des d'erreurs successives d'arrondi. Aussi connu sous le nom de "Gaussian rounding"

    Voici qlq explications.

    http://www.xbeat.net/vbspeed/i_BankersRounding.htm

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. virgule dans un InputText avec BigDecimal
    Par comboDev dans le forum JSF
    Réponses: 4
    Dernier message: 29/08/2006, 14h59
  2. Structurer un Bigdecimal!
    Par vempiria dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 18/05/2006, 10h42
  3. acepter deux decimal avec la classe BigDecimal
    Par mehdi_swatch dans le forum Langage
    Réponses: 2
    Dernier message: 15/05/2006, 12h40
  4. [Calcul] difficulté avec BigDecimal
    Par dinver dans le forum Langage
    Réponses: 4
    Dernier message: 01/01/2006, 16h41
  5. [BigDecimal] les arrondis...
    Par LoulouFifi dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 13/01/2004, 18h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo