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 :

Comment récupérer la partie décimale d'un double


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Comment récupérer la partie décimale d'un double
    Bonjour,

    Je suis nouveau sur le forum, et aussi en programmation Java (je viens du monde client/serveur PowerBuilder/Cobol)... Et voici déjà un petit problème... Quelqu'un sait m'aider ?

    J'ai la variable suivante :

    double d = 1234567890.123456

    Et j'ai besoin de stocker la partie décimale dans une variable long, donc j'aimerais avoir

    long l = 123456

    Je n'arrive déjà pas à trouver un moyen pour obtenir dans une autre variable double le contenu suivant 0.123456 mais j'obtiens 0.12345600128173828 à cause de la précision (ou imprécision) bizarre des zones de type double (d'ailleurs le problème existe aussi avec les float)... Mais peut-être que je m'y prends mal... Au départ je voulais simplement stocker la valeur dans une String ou une zone BigDecimal mais j'ai toujours ces chiffres supplémentaires qui sont stockés derrière mes 6 premières positions de mon exemple...

    Quelqu'un a une idée ??

    Le but c'est de traduire un nombre de type double en lettres (avec un librairie de chez ibm... icu)... Il faut isoler la partie entière et la partie décimale pour les traiter séparément.

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Points : 1 512
    Points
    1 512
    Par défaut
    Il y a peut etre plus simple, mais moi je ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double d = 1234567890.123456;
    int i = new Double(d).intValue(); //recuperer la partie entiere
    double decimale = d-(new Double(i).doubleValue());

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Déjà, c'est étonnant que tu veuilles récupérer la partie décimale sans le 0., peut-être un problème de conception?

    Sinon, tu peux toujours faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    double d = ...;
    String s = "" + d;
    int index = s.indexOf('.');
    String decimal;
    if(index >= 0)
        decimal = s.substring(index + 1);
    else
        decimal = "";
    D'ailleurs, je me pose une question, comment récupérer le séparateur décimal (qui peut être '.' ou ',' selon le système, la langue..., non?)?

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Citation Envoyé par jarjardos
    Le but c'est de traduire un nombre de type double en lettres (avec un librairie de chez ibm... icu)... Il faut isoler la partie entière et la partie décimale pour les traiter séparément.
    Un simple DecimalFormat ne te convient pas ? (cf FAQ : Comment convertir un nombre en chaîne formatée ?)

  5. #5
    Membre averti Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Points : 409
    Points
    409
    Par défaut
    D'ailleurs, je me pose une question, comment récupérer le séparateur décimal (qui peut être '.' ou ',' selon le système, la langue..., non?)?

    Pour le separateur, tu peux toujours le cast en String et le splitter je pense.

  6. #6
    Candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai en effet utilisé un decimalFormat

    DecimalFormat df = new DecimalFormat("0.0###################");
    String s = df.format(inNumber);
    int posPoint = s.indexOf('.');
    long decimalPart = new Long(s.substring(posPoint + 1)).longValue();

    Ce qui embêtait un peu l'architecte c'est le nombre fixe de digits derrière la virgule. Il n'y a pas un caractère joker qu'on puisse utiliser ? Style "0.0*" un truc dans le genre ?

    C'est vraiment mon baptême en Java donc il faut le temps de découvrir

    En tout cas merci à tout le monde, on est bien accueilli ici

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    Pour plus d'info sur les patterns utilisables regarde la javadoc de la classe DecimalFormat.
    Pour le nombre fixe de digits derrière la virgule, rien ne t'empêche de faire une méthode qui te renvoie le pattern correspondant au nombre de digit voulu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public String getDecimalFormatPattern(int decimalDigitCount) {
        StringBuilder sb = new StringBuilder();
        sb.append("0.0");
        decimalDigitCount --;
        for(int i = 0; i < decimalDigitCount; i ++) {
             sb.append('#');
        }
        return sb.toString();
    }

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les problèmes de précision sont "normale" étant donnée la représentation des nombres à virgules flottantes (il y a plusieurs messages sur le forum à ce sujet).

    Sinon il suffit de manipuler le DecimalFormat pour en faire ce que tu souhaite :
    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
        public static double decimal (double d) {
            // on crée un DecimalFormat pour formater le double en chaine :
            DecimalFormat df = new DecimalFormat();
            df.setGroupingUsed(false);            // Pas de regroupement dans la partie entière
            df.setMinimumFractionDigits(1);        // Au minimum 1 décimale
            df.setMaximumFractionDigits(340);    // Au maximum 340 décimales (valeur max. pour les doubles / voir la doc)
     
            // On formate le double en chaine
            String str = df.format(d);
            // On récupère le caractère séparateur entre la partie entière et décimale :
            char separator = df.getDecimalFormatSymbols().getDecimalSeparator();
            // On ne récupère que la partie décimale :
            str = str.substring( str.indexOf(separator) + 1 );
            // Que l'on transforme en double :
            return Double.parseDouble(str);
        }
    a++

  9. #9
    Candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ca marche !!!

    Un grand merci à tout le monde

  10. #10
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 778
    Points
    5 778
    Par défaut
    J'avais effectivement oublié les methodes setMinimumFractionDigits() et setMaximumFractionDigits() (tu peux oublier ma méthode de bourrin ).

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/05/2021, 15h33
  2. Réponses: 13
    Dernier message: 20/04/2009, 11h53
  3. Comment récupérer une partie d'image?
    Par fredonouille dans le forum C#
    Réponses: 5
    Dernier message: 28/09/2007, 12h06
  4. comment récupérer une partie d'une chaine
    Par yannickrohel dans le forum C
    Réponses: 7
    Dernier message: 27/02/2006, 10h31
  5. récupérer la partie décimale d’un champ
    Par maouazzani dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/04/2004, 16h10

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