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

Java Discussion :

Formatage de float en Java


Sujet :

Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Formatage de float en Java
    Bonjour,

    mon besoin est simple:
    je récupère un float dans un fichier XML que je veux formatter dans un fichier texte, avec un pattern particulier (8 chiffres après la virgule, 2 avant)

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String patternNNDotNNNNNNNN = "%11.8f";
    float value = 1.70473711f;
    String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, value);
    System.out.println(result);
    en résultat, j'obtiens :
    1.70473707
    pareil si j'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        	java.text.DecimalFormatSymbols symbols = new java.text.DecimalFormatSymbols(java.util.Locale.US);
        	java.text.DecimalFormat df = new java.text.DecimalFormat("##.########", symbols);
        	System.out.println(df.format(value));
    je ne comprends pas pourquoi j'ai cet arrondi qui est fait (le 11 se transforme en 07)...

    merci pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    en fait ça n'a rien à voir avec le formatage, et tout à voir avec les floats.

    Tu as probablement entendu dire que les floats et les doubles contiennent des résultats approchés, et non pas les vrais nombres réels mathématiques. Si tu ne l'as pas entendu dire, ça devrait être évident : tu peux avoir un float de valeur 1 et le diviser par 3. Tu crois vraiment que le résultat va être exactement 1/3 ?

    Donc, les floats font des calculs approximatifs.

    Et 1.70473707 c'est plutôt proche de 1.70473711, donc bah voilà, rien de bien surprenant.

    Si tu veux aller vers le fin mot de l'histoire, ce qu'il faut comprendre c'est qu'un float, ça reste une donnée stockée sur 32-bits. Elle ne peut pas prendre une infinité de valeurs différentes, ça demanderait une infinité de bits. Un float ne peut prendre que les valeurs qui lui sont possibles avec ses 32 bits.

    Et donc, un float ne peut pas prendre la valeur 1.70473711. Si tu lui demandes de le faire quand même, il prendra une valeur approchée, la plus proche. En l'occurrence 1.70473706722259521484375.

    Si tu prends 8 chiffres après la virgule et que tu arrondis, ça donne bien 1.70473707.

    Voilà voilà voilà.

    A noter que tout cela révèle bien la précision pitoyable des floats. Tu n'as demandé que 8 chiffres après la virgule d'un nombre entre 1 et 2, et tu as pu atteindre les limites de float.

    C'est pour cela qu'on est censé utiliser les doubles et jamais les floats, sauf dans le cas où on sait pourquoi plutôt les floats, ce qui clairement n'est pas ton cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Pour aller plus loin : IEEE 754
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses. Je vais donc convertir ces données en double dans mon code

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Le soucis est exactement le même, juste tu as une plus grande précision.
    Il va peut-être falloir aller regarder du coté de BigDecimal ou de libs mathématiques spécialisées.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. Formatage d'une LocalDate (Java 8)
    Par VirgApps dans le forum JSF
    Réponses: 1
    Dernier message: 09/04/2014, 11h57
  2. formatage du date en java
    Par youzigh dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 16/11/2011, 13h50
  3. Comparer 2 variables de type Float en java
    Par sonia5 dans le forum Langage
    Réponses: 5
    Dernier message: 15/03/2011, 11h43
  4. [awk] Formatage de float
    Par szdavid dans le forum Autres langages
    Réponses: 1
    Dernier message: 16/03/2006, 14h52
  5. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37

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