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

 C Discussion :

Gestion décimales float


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut Gestion décimales float
    Bonjour,

    J'ai un petit soucis au niveau des floats

    Comment vérifier qu'une entrée utilisateur (scanf) ne comporte qu'une seule décimale ?

    J'ai déja testé avec une idée de cast et des multiplication par 10 mais le problème reste car dans un float si j'entre 23.56 j'ai en réalité 23.5600012
    Je suppose que tout ça est du au calcul logarithmique utilisé par le pc.

    Donc si vous aviez une piste en utilisant scanf & des casting je suis à votre écoute !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Haknaton Voir le message
    Bonjour,

    J'ai un petit soucis au niveau des floats

    Comment vérifier qu'une entrée utilisateur (scanf) ne comporte qu'une seule décimale ?

    J'ai déja testé avec une idée de cast et des multiplication par 10 mais le problème reste car dans un float si j'entre 23.56 j'ai en réalité 23.5600012
    Je suppose que tout ça est du au calcul logarithmique utilisé par le pc.

    Donc si vous aviez une piste en utilisant scanf & des casting je suis à votre écoute !
    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
    23
    24
    25
    26
    27
    28
    29
    30
    char saisie[256];
    float nb;
     
    // Prompt
    printf("Entrez un nombre flottant :");
    fflush(stdout);
     
    // Saisie
    fgets(saisie, 256, stdin);
     
    // Si chaine saisie ne peut pas passer par sscanf
    if (sscanf(saisie, "%f", &nb) < 1)
         printf("Vous n'avez pas saisi un nombre correct\n");
    else
    {
         char *pt;
     
         // Recherche du point décimal
         if ((pt=strchr(saisie, '.')) != NULL)
         {
            // Si la chaine qui suit ce point n'est pas de longueur "1"
            if (strlen(pt + 1) != 1)
                printf("Vous n'avez pas saisi un nombre correct\n");
            else
                printf("ok\n");
          }
          else    
             // Pas de point décimal
             printf("ok");
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut
    Merci Sve@r pour ce bout de code.
    Je dis Oui maiiiis non.

    car je dois élaborer mon code sans utiliser de contrôle au niveau d'une chaine de caractère.
    Je n'ai pas testé ton code mais en effectuant une lecture en %f tu devrais avoir le même problème que moi > avoir plus de décimales sur le float que le nombre de décimales réelles entrées par l'utilisateur.

    Mais bon merci d'avoir répondu... Je suis toujours en train de chercher

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (pt=strchr(saisie, '.') != NULL)
    Si on veut rester portable et même propre je dirais il vaut mieux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <locale.h>
    ...
    if (pt=strchr(saisie, localeconv()->decimal_point) != NULL)
    Cordialement.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Haknaton Voir le message
    Bonjour,

    J'ai un petit soucis au niveau des floats

    Comment vérifier qu'une entrée utilisateur (scanf) ne comporte qu'une seule décimale ?

    J'ai déja testé avec une idée de cast et des multiplication par 10 mais le problème reste car dans un float si j'entre 23.56 j'ai en réalité 23.5600012
    Je suppose que tout ça est du au calcul logarithmique utilisé par le pc.

    Donc si vous aviez une piste en utilisant scanf & des casting je suis à votre écoute !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( ((int)(nombre*100.0) - 10*(int)(nombre*10.0)) == 0 )
      printf ( "OK\n");
    else
      printf ("Vous avez rentré 1 décimale de trop... !!\n");
    si c'est sur le résultat..

    Et la méthode de Sve@r si c'est directement à la saisie...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Si on veut rester portable et même propre je dirais il vaut mieux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <locale.h>
    ...
    if (pt=strchr(saisie, localeconv()->decimal_point) != NULL)
    Cordialement.
    Ouaip. C'est vrai que si on veut vraiment aller au bout de certaines choses...
    C'est comme avec Qt. Je fais souvent mes labels QLabel("truc") mais si vraiment je voulais être international, je devrais faire QLabel(tr("truc")).

    Citation Envoyé par souviron34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( ((int)(nombre*100.0) - 10*(int)(nombre*10.0)) == 0 )
      printf ( "OK\n");
    else
      printf ("Vous avez rentré 1 décimale de trop... !!\n");
    Ah oui, c'est assez joli comme soluce...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ( ((int)(nombre*100.0) - 10*(int)(nombre*10.0)) == 0 )
      printf ( "OK\n");
    else
      printf ("Vous avez rentré 1 décimale de trop... !!\n");
    Ne fonctionne pas avec nombre = 1.009 par exemple.

    Mais plus généralement, le seul moyen sûr de savoir quelque chose sur les décimales telles qu'entrées par l'utilisateur, c'est de ne pas passer par un format qui n'est pas décimal.

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut
    Et bien merci les gens ! je teste ça cette nuit ...

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Ne fonctionne pas avec nombre = 1.009 par exemple.

    Mais plus généralement, le seul moyen sûr de savoir quelque chose sur les décimales telles qu'entrées par l'utilisateur, c'est de ne pas passer par un format qui n'est pas décimal.



    j'ai dit si c'est le RESULTAT (et je n'ai pas voulu ce que je mettrais moi-même, qui serait plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ( fabs((nombre*100.0) - 10.0*(float)((int)(nombre*10.0))) < 0.00001 )
      printf ( "OK\n");
    else
      printf ("Vous avez rentré 1 décimale de trop... !!\n");
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ( fabs(float((int)(nombre*10.0)) - (10.0*nombre)) < 0.00001 )
      printf ( "OK\n");
    else
      printf ("Vous avez rentré 1 décimale de trop... !!\n");
    )


    Si c'est la saisie, j'ai dit que c'était l'autre solution....

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

Discussions similaires

  1. Gestion décimales dans un Etat
    Par Boubker_023 dans le forum IHM
    Réponses: 2
    Dernier message: 26/05/2011, 21h40
  2. [Propel] [sf 1.2] gestion de float dans une requete
    Par Zen_Fou dans le forum ORM
    Réponses: 1
    Dernier message: 11/12/2010, 17h30
  3. PHP et gestion des float
    Par ionesco dans le forum Langage
    Réponses: 7
    Dernier message: 23/09/2010, 16h43
  4. Limiter décimals float en entrée
    Par Yunchi dans le forum Débuter
    Réponses: 14
    Dernier message: 07/04/2009, 11h25
  5. la gestion des floats
    Par internet dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 04/08/2008, 17h18

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