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 : comment contrôler le nombre de décimales?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut BigDecimal : comment contrôler le nombre de décimales?
    Bonjour,

    J'ai un problème qui paraît simple, mais auquel je ne trouve pas de réponse satisfaisante.

    J'ai un nombre au format BigDecimal, dont je souhaite contrôler la saisie.

    Il doit être positif => montant.signum() == -1.
    Là c'est facile...
    Mais l'utilisateur ne doit pas pouvoir saisir plus de 2 décimales.

    Et là, la fonction scale de BigDecimal ne me semble d'aucun secours.

    Auriez-vous une idée lumineuse?
    Je vous remercie par avance.

    Bonne journée.
    TS

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Par défaut
    Changer de format.

    Le BigDecimal n'est pas trop bien adapté à ce contexte de contrôle de saisie.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    BigDecimal a = new BigDecimal(0);
    BigDecimal b = new BigDecimal(1);
    BigDecimal c = new BigDecimal(-1);
    BigDecimal d = new BigDecimal(1.24);
    BigDecimal e = new BigDecimal(1.205);
     
    List<BigDecimal> list = new ArrayList<BigDecimal>();
    list.add(a);
    list.add(b);
    list.add(c);
    list.add(d);
    list.add(e);
     
    for(BigDecimal biggy : list){
    	System.out.println("BigDecimal : " + biggy);
    	System.out.println("Signum : " + biggy.signum());
    	System.out.println("Scale : " + biggy.scale());
    }
    Donne en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    BigDecimal : 0
    Signum : 0
    Scale : 0
    BigDecimal : 1
    Signum : 1
    Scale : 0
    BigDecimal : -1
    Signum : -1
    Scale : 0
    BigDecimal : 1.2399999999999999911182158029987476766109466552734375
    Signum : 1
    Scale : 52
    BigDecimal : 1.2050000000000000710542735760100185871124267578125
    Signum : 1
    Scale : 49

    Donc scale marche bien. Mais c'est le format du BigDecimal qui pose problème.

    Ne peux tu pas utiliser un double et le convertir ensuite en BigDecimal si tu en as vraiment besoin?

    Sinon une remarque : si ton BigDecimal est positif, son signum est 1 pas -1.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Le problème du bigdecimal (et aussi du double ou de tout autre format utilisant des puissance de 1/2), c'est qu'il n'y a pas de lien direct entre le nombre de décimales présentes dans le nombre binaire, et le nombre de décimal présentes dans son affichage décimal (et oui, la conversion base 2 base 10 n'est pas génial).

    Si tu veux limiter le code à 2 décimale, le mieux serait d'utiliser un int / long ou bigInteger, et de le considérer comme représentant le nombre de centièmes. Du coup toutes les opérations se feront en nombre entier à virgule fixe.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut
    Bonjour,

    Merci pour vos réponses. Du coup ça sent le roussi pour mon BigDecimal

    Bonne journée

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut
    Bon, au cas où cela pourrait resservir à quelqu'un, j'ai écrit la petite méthode suivante, qui fait je crois l'affaire pour ce que je recherchais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     private boolean verifierNombreDecimalesSaisies(String nombreSaisi, int nombreDecimalesVoulues)
        {
            boolean plusDeDeuxDecimales = false;
            String avantSeparateur;
            String apresSeparateur = null;
     
            StringTokenizer stoken = new StringTokenizer(nombreSaisi, ".");
            avantSeparateur = stoken.nextToken();
            if (stoken.hasMoreTokens())
            {
                apresSeparateur = stoken.nextToken();
            }
     
            if (apresSeparateur != null && apresSeparateur.length() >  nombreDecimalesVoulues)
            {
                plusDeDeuxDecimales = true;
            }
     
            return plusDeDeuxDecimales;
     
        }
    En clair, je passe le BigDecimal sous la forme d'un String à la méthode, avec en paramètre également le nombre max de décimales voulu, et ça me renvoie vrai ou faux si ça dépasse ou pas....

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Oui, ca marche aussi avec 1 ligne (sans tests de validité d'entrée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (nombreSaisi.split(".")[1].length()>2)?false:true;
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    On va me traiter de chieur, mais ils semble que vous ayez tous oublié cette notation:


    3456E-5

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut
    Certes, c'est du mantisse/exposant, mais la conversion en String est satisfaisante, du coup, je ne vois pas trop le problème...mais j'ai peut-être raté un épisode?

  9. #9
    Membre chevronné Avatar de Ceddoc
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 493
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Oui, ca marche aussi avec 1 ligne (sans tests de validité d'entrée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (nombreSaisi.split(".")[0].length()>2)?false:true;

    Sans parler de la notation évoquée par tchize_

    C'est moi ou tu prend avant la virgule là? Il faudrait pas prendre [1] après avoir testé si cette case du tableau existe?

    J'ai du louper un truc.

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 098
    Par défaut
    Et oui en effet, la notation scientifique n'est pas prise en comptes

    Non non tu as raison pour [1] Ceddoc.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/03/2014, 20h55
  2. [PHP 5.2] Comment personalisé le nombre de décimal apres la virgule
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2009, 19h10
  3. Réponses: 5
    Dernier message: 20/04/2007, 09h00
  4. Comment fixer le nombre de décimal !
    Par Paul1804 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/01/2006, 15h12
  5. Comment convertir un nombre de jours décimal en date
    Par Soutou dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/11/2005, 00h57

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