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

JavaScript Discussion :

stockage des nombres à virgule flottante


Sujet :

JavaScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut stockage des nombres à virgule flottante
    Bonjour à tous,

    Je m'étais heurté à un problème de comparaison de résultats en PHP qui avait trouvé sa réponse dans un post sur le forum :

    les résultats que tu obtiens viennent de la façon dont sont stockés les nombre à virgule flottante (en PHP et avec d'autres langage)
    par exemple 1.4 est stocké sous la forme 1.399999999999999911182158029987476766109466552734375
    donc tu ne peux pas utiliser "==" et "!=" mais tu dois vérifier que la différence de 2 nombres est plus petite qu'une certaine valeur comme ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo (abs($totalNet - $sommeRecue) < 0.000001) ? 'égaux' : 'différents';
    Je voudrais savoir s'il faut prendre les mêmes précautions en Javascript ?

    Bon dimanche à tous.

  2. #2
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    pas compris la question
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Bonjour Le_chomeur,

    J'avais eu un problème en PHP du fait qu'un nombre à virgule flottante n'est pas stocké en php sous la forme à laquelle on pourrait s'attendre.

    Par exemple 1.4 est stocké sous la forme 1.399999999999999911182158029987476766109466552734375

    ce qui fait qu'une comparaison d'égalité entre 1.4 et le résultat d'une opération donnant 1.4 disait : false.

    il faut (en php) utiliser la forme : abs($totalNet - $sommeRecue) < 0.000001

    pour vérifier que ces deux nombres ont la même valeur, ou dumoins que leur différence est acceptable.

    En gros, le résultat d'une opération sur des Float qui donne 1.4 est-il bien stocké en mémoire sous la forme 1.4 ou comme en PHP sous la forme : 1.399999999999999911182158029987476766109466552734375 ?

    Pour mieux comprendre tu peux aussi regarder ce post :
    http://www.developpez.net/forums/d59...isation-round/

    dont les 3 dernières réponses expliquent ce problème.

    Bonne journée

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    ça arrive aussi en JavaScript, comme dans tous les langages de programmation. ce n'est pas une question de langage mais de stockage des nombres à virgule flottante. le test == marche souvent mais il arrive de tomber sur le cas cité.
    tu peux continuer à tester l'égalité si tu fixes la précision à x chiffres après la virgule avec toFixed() par exemple. 1.399999999995456465 avec toFixed(6) par exemple donnera 1.40000 (==1.4). dans ce cas il faut fixer la précision de manière pertinente. dans mon exemple si tu mets toFixed(12) ou plus, ça ne marchera pas

  5. #5
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    ok je comprend mieux ...
    je ne connaissais pas ce problème de gestion des float dans les langages de prog

    Bon a savoir
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Merci pour vos réponse

    c'est donc un trait commun à tous les langages de prog.

    Une petite remarque concernant ta réponse bigboomshakala : je pense qu'il faudra faire attention à refaire un parseFloat après utilisation d'un toFixed() car toFixed retourne une chaine de caractère...

    d'ailleurs, de fait puisqu'on refait un parseFloat avant de comparer il sera encore préférable (pour les mm raisons) de ne pas chercher à tester avec une égalité, même après conversion...

    Il vaut mieux tester avec une approximation précise ( genre différence < 0.0001).

    Qu'en penses-tu ?

    Bonne journée.

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    Il y a déjà eu plusieurs post sur le sujet des virgules flottantes qui donnent des solutions d'arrondis, du coup les opérateurs de comparaison directs deviennent utilisables ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par Alexdezark Voir le message
    Une petite remarque concernant ta réponse bigboomshakala : je pense qu'il faudra faire attention à refaire un parseFloat après utilisation d'un toFixed() car toFixed retourne une chaine de caractère...
    possible, cela dit si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(2*6 == (12.0000123456).toFixed(3))
    ça me renvoie "true", donc le résultat de toFixed est comparable à un float (12 == 12.000)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Intéressant bigboomshakala,

    ça veut-dire que Javascript interprète une chaine de caractère correctement formatée à son équivalent en Float.

    C'est ici :

    http://quentinc.net/ref/tofixed/

    Que j'ai trouvé la note concernant le résultat retourné par toFixed en tant que chaine de caractères.

    Bonne journée

  10. #10
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    En passant par ==, javascript ignore le type, en passant par ===, javascript teste aussi le type !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/05/2021, 15h33
  2. [Débutant] Imprécision des nombres à virgule flottante
    Par Saturnin123 dans le forum Général Python
    Réponses: 6
    Dernier message: 31/08/2011, 21h21
  3. Réponses: 64
    Dernier message: 14/02/2011, 14h02

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