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 :

Cast d'un String en Float.


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Cast d'un String en Float.
    Bonjour !

    Je dois actuellement développer une application qui exploite un fichier XML pour stocker des informations en mémoire.

    On trouvera par exemple dans le fichier XML à propos d'une voiture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <Consommation>600</Consommation>
    A l'aide d'un parser je lis cette information et dans mon modèle cette info stockée dans un float.

    Comme mon parser me renvoie une chaîne de caractère "600", je vais devoir caster la châine de carcatère "600" en un String.

    Pour cela j'ai écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float monFloat;
    monFloat =Float.parseFloat(Consommation);//Consommation vaut "600"
    Le problème :
    monFloat est égal à 600.0 ce qui ne me convient pas car j'aimerais garder exactement la même valeur (y compris avec les chiffres significatifs) que ce que je vois sur le fichier XML.

    Je précise que mon fichier XML regorge de valeurs à mettre dans des float côté Java et qui ont des tailles très variables : Un coup 600, un autre "1.265438" un autre "1e-7"

    Ma question :
    Existe-il un moyen de dire à Java : "voici un String, caste le moi en float et garde le même format ?"


    merci d'avance !

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Un float n'a pas de format. C'est juste une valeur. Après tout, 600, 6E+2, 600.00 c'est la même valeur. Si tu veux conserver la notation d'origine, tu conserve la String. (ou plutot, tu en fais un copie, pour tout un tas de raisons )

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Merci pour cette réponse.

    En fait justement, selon moi 600 ce n'est pas 6*10²
    Parce que si je veux réutiliser cette valeur dans un programme derrière et que je la multiplie par 11 par exemple, dans un cas ca me donne 6.6*10³ dans l'autre ca me donne 7*10³.

    C'est le problème des chiffres significatifs. je veux garder la précision qui est dans mon fichier XML.

    Sinon, si je conserve la valeur en String, elle est inutilisable dans des opérations utlérieures.

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Si tu souhaites conserver le format après avoir effectué des opérations, tu vas devoir:
    1. analyser le format
    2. convertir en float
    3. faire le calcul
    4. formatter le résultat avec le format trouvé en 1


    Tu peux très bien créer une classe FormattedFloat qui encapsule la valeur en float et le format. Les manipulations devraient alors être assez simples.

    Le GROS hic, c'est l'analyse du format...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par malaboss Voir le message
    je la multiplie par 11 par exemple, dans un cas ca me donne 6.6*10³ dans l'autre ca me donne 7*10³.
    Je me demande bien où t'as été cherché ces math. Les float sont stockés sur le format IEEE 754 dans lequel chaque valeur possible a une seule représentation autorisée qui vise à l'optimisation de la précision. Bien sur, tu as toujours la problème de la conversion d'un système décimale (système auquel l'être humain est habitué) vers un système binaire (connu des machine) où tu peux avoir des problème vers les dernière virgules. Si efectivement tu part loin derrière la virgule binaire et que tu as un problème de précision, utilise un double pour avoir plus de bits.

    Si tu veux des calculs exacts, utilise BigDecimal, mais encore une fois, ça ne conservera pas le format d'origine qui n'est qu'une représentation.

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Citation Envoyé par malaboss Voir le message
    Merci pour cette réponse.

    En fait justement, selon moi 600 ce n'est pas 6*10²
    Parce que si je veux réutiliser cette valeur dans un programme derrière et que je la multiplie par 11 par exemple, dans un cas ca me donne 6.6*10³ dans l'autre ca me donne 7*10³.

    C'est le problème des chiffres significatifs. je veux garder la précision qui est dans mon fichier XML.

    Sinon, si je conserve la valeur en String, elle est inutilisable dans des opérations utlérieures.
    Il te faut juste donc un objet qui encapsule ton float et un int représentant le nb de chiffre significatif que tu avais à la lecture. Mais tes opérations derrières te donneront les mêmes résultats.

  7. #7
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    selon moi 600 ce n'est pas 6*10²
    Parce que si je veux réutiliser cette valeur dans un programme derrière et que je la multiplie par 11 par exemple, dans un cas ca me donne 6.6*10³ dans l'autre ca me donne 7*10³.
    ! ! !

    Et si tu la multiplie par 1 ? ça fait 6*10³ ? ou 7*10² ?
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par malaboss Voir le message
    En fait justement, selon moi 600 ce n'est pas 6*10²
    Parce que si je veux réutiliser cette valeur dans un programme derrière et que je la multiplie par 11 par exemple, dans un cas ca me donne 6.6*10³ dans l'autre ca me donne 7*10³.
    Ah. L'arithmétique prézarbloxienne de la galaxie d'Ida, Java ne la gère pas. Il faut implémenter toi-même les types de données correspondant et les opérations dessus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Points : 519
    Points
    519
    Billets dans le blog
    1
    Par défaut
    slt,
    je ne pense pas qu'il existe ce genre de méthodes, mais tu pouvais le faire manuellement. Récupérer la donnée en temps que nombre flottant, et le convertir en String, ou bien le récupérer directement en String, en suite obtenir la position du point, ou de la virgule, et supprimer les caractères a partir de cette position, jusqu'a la fin de la chaine, Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String s = getNombreDepuisXml ();
            if (s.contains ("."))
            {
                int i = s.indexOf (".");
                s = s.replace (s.substring (i, s.length ()), "");
                System.out.println (s);
            }
    PS : Le titre de ton poste est magnifique, tu devrais y rejeter un coup d’œil, il est très sympa .
    A+ .

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Salut,
    bon j'ai vu que ce que je cherchais à faire n'était pas très clair pour tout le monde.
    Il faut voir ça du point de vue de la précision : si je reçois une donnée dans mon fichier XML (600) alors je sais qu'elle est comprise dans un certain intervalle, implicitement ( [599.5, 600.5[ ). A contrario, si je reçois une donnée avec moins de chiffres significatifs (6*10²), je sais implicitent qu'elle est comprise dans un intervalle différent ( [550 , 650 [ ) et ça change tout pour la suite des calculs !

    Je pense qu'il faudra donc que je garde le nombre de chiffres significatifs dans un int à la lecture, ce qui nécessitera de réaliser un traitement supplémentaire pour chaque nombre lu.

    Merci à tous, et n'hésitez pas si vous trouvez un moyen plus simple.

  11. #11
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par malaboss Voir le message
    En fait justement, selon moi 600 ce n'est pas 6*10²
    Rassure toi, pour java, c'est la meme chose.

    Citation Envoyé par malaboss Voir le message
    Parce que si je veux réutiliser cette valeur dans un programme derrière et que je la multiplie par 11 par exemple, dans un cas ca me donne 6.6*10³ dans l'autre ca me donne 7*10³.

    C'est le problème des chiffres significatifs. je veux garder la précision qui est dans mon fichier XML.
    Les chiffres significatifs ne rentrent en jeu que pour l'affichage du float. Pas pour le calcul.

    Ainsi, si tu crées un float initialisé à 600 et que tu multiplies par 1.1, le résultat sera toujours 6.6E2 (=660). Par contre, si pour le représenter, tu veux n'utiliser que 1 chiffre significatif, alors le résultat sera 7E2. Mais le calcul original sera bon quand meme.

    J'ai l'impression que ton probleme est surtout de connaitre le nombre de chiffres significatifs originaux afin de conserver le meme apres calcul. Dans ce cas, il faudrait compter dans le String recupéré du fichier xml le nombre de chiffres significatifs et le stocker. Ainsi, tu pourras afficher correctement le résultat voulu.



    Citation Envoyé par mohamine1989 Voir le message
    s = s.replace (s.substring (i, s.length ()), "");
    Ca, ca revient à faire : s = s.substring (1,i);

    EDIT : faute de frappe

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Mouais. Je vois que Wikipédia est d'accord avec cette vision des choses. À mon époque, un chiffre significatif, c'était la même chose qu'un significant figure, et 600 et 6*10² étaient la même chose, parce que seules les notations scientifiques pouvaient se distinguer entre 6*10² et 6,00*10².

    Enfin, finalement, la nomenclature bizarre française, c'est la même chose que mon machin prézarbloxien. C'est pas géré donc il faut le gérer soi-même.
    Comme tu l'as dit, il faut juste garder à la fois la valeur du nombre, et son nombre de chiffres significatifs.

    Le soucis ça va être pour réafficher le résultat. DecimalFormat peut sans problème te transformer 6600 en 7e3 (notation scientifique à un chiffre significatif), mais pas en 7000 (notation décimale qui arrondit avant la virgule, un concept alien).
    Je crois que la solution la moins compliquée, pour ce cas, sera de diviser par des puissances de 10 pour amener le dernier chiffre significatif à l'unité, arrondir (avec un cast vers long par exemple,) et remultiplier.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par malaboss Voir le message
    Il faut voir ça du point de vue de la précision : si je reçois une donnée dans mon fichier XML (600) alors je sais qu'elle est comprise dans un certain intervalle, implicitement ( [599.5, 600.5[ ). A contrario, si je reçois une donnée avec moins de chiffres significatifs (6*10²), je sais implicitent qu'elle est comprise dans un intervalle différent ( [550 , 650 [ ) et ça change tout pour la suite des calculs !
    Heu non, ou alors ton XML est vachement tordu pour sous entendre ce genre de chose.

    600 ou 6E2 c'est la même chose et la précision est la même. Pourquoi? Parce que si la valeur était 599.1 tu aurais eu dans ton xml 599.1 ou 5.991E2. Ce n'est pas parce qu'aucune décimale n'est présente dans ta représentation que le nombre n'est pas précis, il est quand même conventionnel de supprimé les décimale nulles en général.

    Si par le plus grand des hasards tu devait traiter tes données avec une marge d'erreur, il faudra t'orienter vers la classe BigDecimal. Cependant, cette classe permet des précisions arbitraires, mais ne permet pas de gérer les marges d'erreur comme tu semble le souhaiter.

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

Discussions similaires

  1. convertir std::string en float
    Par radicalrider dans le forum SL & STL
    Réponses: 20
    Dernier message: 03/07/2006, 18h50
  2. Convertir un String en Float
    Par alex75 dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2006, 19h58
  3. casting DWORD en string, garder la même valeur
    Par titouille dans le forum SL & STL
    Réponses: 2
    Dernier message: 19/08/2005, 21h17
  4. [string] [float] string to float en sql
    Par chickenhuchette dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 17/06/2005, 11h47
  5. [tableau à 2 dimensions] association String et float
    Par LoLoSS dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/07/2004, 10h53

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