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

API standards et tierces Java Discussion :

[Débutant] NumberFormat qui arrondit bizarrement


Sujet :

API standards et tierces Java

  1. #1
    Membre averti Avatar de Warz
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 48
    Par défaut [Débutant] NumberFormat qui arrondit bizarrement
    Bonjour à tous,

    Rien de mieux qu'un bout de code pour comprendre :

    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
    22
    // NumberFormat
    String nombre = "12.123455";
    String nombre2 = "12.612325";
    Integer minDecimal = new Integer("2");
    Integer maxDecimal = new Integer("5");
    NumberFormat nf = NumberFormat.getInstance();
    double nombreFloat = new Double("0");
    double nombreFloat2 = new Double("0");
    try {
    	nombreFloat = (new Double(nombre)).doubleValue();
    	nombreFloat2 = (new Double(nombre2)).doubleValue();
    } catch(NumberFormatException nfe){
    	nfe.printStackTrace();
    }
    if(minDecimal!=null){
    	nf.setMinimumFractionDigits(minDecimal.intValue());
    }
    if(maxDecimal!=null){
    	nf.setMaximumFractionDigits(maxDecimal.intValue());
    }
    System.out.println("\n\nNumberFormat : " + nf.format(nombreFloat));
    System.out.println("NumberFormat : " + nf.format(nombreFloat2));
    Et voici les résultats dont le deuxième qui me surprend quelque peu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NumberFormat : 12,12346
    NumberFormat : 12,61232
    Quelqu'un sait-il pourquoi le deuxième résultat n'est pas "12.61233" ?

    Pour info, vous pouvez aussi essayer avec "12.612315" avec il va bien vous donner "12.61232" !!!

    En théorie, vu qu'il y a un 5 derrière il n'y a même pas à se poser la question. Ai-je louper un cours élémentaire de maths en ce qui concerne les arrondis ???

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    A vérifier s'il ne s'agit pas d'un problème de représentation des double (pour lequel tu trouveras pas mal de précisions en cherchant sur ce forum).
    Je n'ai pas les moyens de vérifier ici, mais en supposant que 12.612325 se représente en double en qqchose comme 12.6123249999998 par exemple, c'est normal que ça s'arrondisse en 12.612324.

    Essaye de travailler avec des BigDecimal si tu veux plus de précision ...

  3. #3
    Membre expérimenté Avatar de coco62
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 237
    Par défaut
    Bonjour,
    C'est un comportement que l'on retrouve régulièrement sur intel/windows.

    L'utilisation de BigDecimal é&vite ce soucis.

    <code>
    String nombre = "12.123455";
    String nombre2 = "12.612325";

    java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
    nf.setMinimumFractionDigits(2);
    nf.setMaximumFractionDigits(5);
    double nombreFloat = (new Double(nombre)).doubleValue();
    double nombreFloat2 = (new Double(nombre2)).doubleValue();
    BigDecimal nombreFloat3 = new BigDecimal(nombreFloat2);

    System.out.println("\n\nNumberFormat : " + nf.format(nombreFloat));
    System.out.println("NumberFormat : " + nf.format(nombreFloat2));
    System.out.println("NumberFormat : " + nf.format(nombreFloat3));

    </code>

    donne
    <code>
    NumberFormat : 12,12346
    NumberFormat : 12,61232
    NumberFormat : 12,61233
    </code>

  4. #4
    Membre averti Avatar de Warz
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 48
    Par défaut
    Merci, j'ai en effet suivi cette piste mais avec un petit test je reste sur le même résultat... Encore un bout de code :

    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
    // NumberFormat en BigDecimal
    BigDecimal nombreBigDecimal = new BigDecimal("0");
    BigDecimal nombreBigDecimal2 = new BigDecimal("0");
    try {
    	nombreBigDecimal = new BigDecimal(nombre);
    	nombreBigDecimal2 = new BigDecimal(nombre2);
    } catch(NumberFormatException nfe){
    	nfe.printStackTrace();
    }
    if(minDecimal!=null){
                 nf.setMinimumFractionDigits(minDecimal.intValue());
    }
    if(maxDecimal!=null){
    	nf.setMaximumFractionDigits(maxDecimal.intValue());
    }
    System.out.println("\nBigDecimal : " + nombreBigDecimal);
    System.out.println("NumberFormat en BigDecimal : " + nf.format(nombreBigDecimal));
    System.out.println("\nBigDecimal : " + nombreBigDecimal2);
    System.out.println("NumberFormat en BigDecimal : " + nf.format(nombreBigDecimal2));
    Et, malheureseument, le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BigDecimal : 12.123455
    NumberFormat en BigDecimal : 12,12346
     
    BigDecimal : 12.612325
    NumberFormat en BigDecimal : 12,61232
    Et j'ai donc toujours le même résultat qui est erroné...

    D'autre piste ? Un paramètre à fournir à NumberFormat ?

    EDIT : pour les modos, si le "problème" n'est pas vraiment à considérer comme un problème d'API, n'hésitez pas à le déplacer. J'ai quand même l'impression que c'est un problème "Général JAVA" plutôt mais bon...

  5. #5
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Tu es sûr que setMaximumFractionDigits est censé arrondir ? Je ne l'ai jamais utilisé, et je ne vois rien de précisé là dessus sur la javadoc ...

Discussions similaires

  1. [débutant] Applet qui ne se charge pas
    Par Death83 dans le forum Applets
    Réponses: 4
    Dernier message: 06/09/2006, 09h20
  2. TWebBrowser qui fonctionne bizarrement
    Par sillycoder dans le forum Delphi
    Réponses: 2
    Dernier message: 18/07/2006, 10h00
  3. Débutant, console qui se ferme /s WinXp
    Par bobobobo01 dans le forum C
    Réponses: 13
    Dernier message: 01/12/2005, 22h53
  4. Réponses: 31
    Dernier message: 25/10/2005, 18h26
  5. [Débutant] MBR qui boote sur un cd
    Par Celelibi dans le forum Assembleur
    Réponses: 6
    Dernier message: 14/08/2005, 15h40

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