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 :

Pourquoi javascript modifie ma variable ?


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : 3°

    Informations forums :
    Inscription : Juin 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Pourquoi javascript modifie ma variable ?
    Bonjour, j’ai un script php qui génère un id aléatoirement, et lorsque je l’utilise en javascript, il me modifie ma variable ! Voici le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id = 2603201817117452020446
    alert(id)
    Nom : 49F4CDBE-38BD-47B9-B7E5-2CEB4FE8A76D.jpeg
Affichages : 204
Taille : 47,9 Ko

    Pourquoi ?

    Cordialement,
    Simon.

  2. #2
    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 640
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    c'est un float ...
    il n'est pas modifié, il est juste écrit autrement
    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 !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : 3°

    Informations forums :
    Inscription : Juin 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour ta réponse, mais, comment faire pour qu’il ne soit pas remis autrement ?

  4. #4
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var id = 2603201817117452020446;
          alert((id).toPrecision(22) );
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : 3°

    Informations forums :
    Inscription : Juin 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    @psychadelic, ton code ne fonctionne malheuresement pas.
    Merci tout de même

  6. #6
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    J'ai essayé chez moi sur FireFox et Chrome, ça marche parfaitement.
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : 3°

    Informations forums :
    Inscription : Juin 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Et bien moi, j’ai copié collé ton code, et l’alert ne fonctionne pas
    Nom : 2C4FD289-83C9-47D9-B8E4-2746D60D876C.png
Affichages : 196
Taille : 127,4 Ko
    Chez toi ça fonctionne ? https://simon511000.fr/testjs/index.html

  8. #8
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    C’est un problème commun à JavaScript et d’autres langages qui utilisent la norme IEEE 754. Tu trouveras plus d’explications sur la page MAX_SAFE_INTEGER du MDN.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var id = 2603201817117452020446;
    console.log(Number.isSafeInteger(id)); // false
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : 3°

    Informations forums :
    Inscription : Juin 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup Watilin, je comprend mieux.
    Il y a moyen de passer outre cette limitation ?

  10. #10
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    Citation Envoyé par simon511000 Voir le message
    oui, ça fonctionne parfaitement : Pièce jointe 364613

    et comme l'a fait remarquer Watilin le chiffre à perdu de sa précision.
    Ce qui est normal, JavaScript conserve les valeurs trop grandes via une notation par valeur exponentielles ce qui leur enlève de la précision.
    Ce n'est pas un langage pour mathématiciens ou comptables, c'est un langage pour pages web.

    Ce ci dit, il existe peut-être une librairie JS qui gère ce genre de besoin, qui sait ??
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  11. #11
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    Ah si : http://mikemcl.github.io/decimal.js/

    ou http://numeraljs.com/ si on à pas besoin de faire des calculs
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : 3°

    Informations forums :
    Inscription : Juin 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci pour tes liens mais je n’arrive pas du tout à les utiliser.
    En fait, j’ai l’impression que c’est des gigantesques librairies de mathématiques, alors que moi je veux juste avoir un grand id dans une variable.
    Pourquoi javascrit a cette limitation est non php ?
    Je ne comprend pas

  13. #13
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Même problème avec PHP : http://php.net/manual/fr/language.types.float.php

    Et c’est facile de vérifier par soi-même :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $unsafe = 2603201817117452020446;
    var_dump($unsafe);
    Ce script m’affiche float 2.6032018171175E+21. On observe bien la conversion en flottant et la perte de précision.

    Si tu as simplement besoin de comparer des id, tu peux les manipuler sous forme de chaînes. Les opérateurs > et < permettent aussi de comparer des chaînes, et la comparaison se fait sur l’ordre des codes ASCII des caractères. Par chance les codes ASCII des caractères "0" à "9" sont dans le même ordre que les chiffres correspondants

    Par contre attention au piège : si tes chaînes sont de longueurs différentes, il faudra remplir la plus courte avec des zéros à gauche, sinon la comparaison ne sera pas bonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    console.log("8" > "5"); // true
    console.log("8" > "53"); // true
    console.log("08" > "53"); // false
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je me trompe peut-être, mais je le passerais en chaine de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id = '2603201817117452020446';
    Ça ne risque plus de changer !

    Et si nécessaire, on utilise Number en cas de calcul ou autre.
    Non ?

  15. #15
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 091
    Points : 16 655
    Points
    16 655
    Par défaut
    Salut

    Citation Envoyé par simon511000 Voir le message
    Bonjour, j’ai un script php qui génère un id aléatoirement,........
    Moi je me demande si simon511000 a vraiment besoin de 999999999999999 idS différentes, car pour moi, la conversion à une puissance n'intervient qu'a partir de 1000000000000000 soit 999999999999999 + 1
    pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  16. #16
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    Citation Envoyé par simon511000 Voir le message
    Merci pour tes liens mais je n’arrive pas du tout à les utiliser.
    En fait, j’ai l’impression que c’est des gigantesques librairies de mathématiques, alors que moi je veux juste avoir un grand id dans une variable.
    Pourquoi javascrit a cette limitation est non php ?
    Je ne comprend pas
    Ben déjà, si c'est juste pour que ce un id, qui est habituellement le terme utilisé pour désigner un identifiant, il est conseillé d'utiliser, et mieux de choisir un type Sting et non un type numérique.
    Et s'il ne s'agit pas d'un identifiant, choisir un autre nom, parce que le terme id est utilisé partout sur les pages html, et choisir un tel terme est le meilleur moyen pour semer la confusion dans la compréhension de ton code.

    Sinoon, la problématique de la précision numérique est une vieille antienne en informatique.

    Les microprocesseurs sont maintenant sur 64 bits, c'est à dire qu'ils ne savent utiliser au mieux des nombres entre - 263 -1 et + 263 -1.
    le 64eme bit est utilisé pour le signe positif ou négatif ( et le -1 parce qu'on part de zéro)

    ce qui représente en format exponentiel +- 9,22337203685e+18

    on est déjà au delà de cette valeur avec ton chiffre dont l’exponentiel est de 21, ce qui signifie que ton chiffre ne rentre pas dans une représentation binaire et directe sur 64 bits.

    La norme dont parle Watilin : IEEE 754 utilise une mantisse de 52 bits, soit -+252 -1 (=9,00719925474e+15), les 11 bits manquant sont eux utilisés pour indiquer la valeur de l'exposant, de 0 à 211 -1 soit de zéro a 2047.

    Au résultat, tant que tu manipule des chiffres utilisant moins de 52bits, leur représentation sera précise, d'ou le test proposé par Watilin ( Number.isSafeInteger(id) ).
    Si tu dépasse ne serait-d'un point, alors leur représentation passe en format exponentiel, et il ne sont plus que des estimations de grandeur.

    Les premiers calculateurs étaient loin d'avoir les 64 bits qu'on connaît aujourd'hui, et il a bien fallut développer les premières librairies de calculs.

    Dans le cas de JavaScript, cette norme est largement suffisante pour couvrir 99% des calculs utiles que l'on peut rencontrer pour faire des pages internet. et en cas de besoin il y a la librairie JavaScript que je t'ai indiqué ( decimal.js).
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : 3°

    Informations forums :
    Inscription : Juin 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ah oui, je ne savais pas qu’il y avait ce problème en php.

    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    je me trompe peut-être, mais je le passerais en chaine de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id = '2603201817117452020446';
    Ça ne risque plus de changer !

    Et si nécessaire, on utilise Number en cas de calcul ou autre.
    Non ?
    Ouiii, ça fonctionne maintenant, il fallait y penser à mettre l’id en string !

    Citation Envoyé par ProgElecT Voir le message
    Moi je me demande si simon511000 a vraiment besoin de 999999999999999 idS différentes, car pour moi, la conversion à une puissance n'ntervient qu'a partire de 1000000000000000 soit 999999999999999 + 1
    Oui, j’ai peut-être un peu exagérer :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $donnees["id"] = "".date(dmYHIs)."".mt_rand(1,999999999)."";
    mais je ne voulais pas que 2 utilisateurs aient la même id, ça ferai tout plenter.

    Citation Envoyé par psychadelic Voir le message
    Ben déjà, si c'est juste pour que ce un id, qui est habituellement le terme utilisé pour désigner un identifiant, il est conseillé d'utiliser mieux de choisir un type Sting et non un type numérique.
    Et s'il ne s'agit pas d'un identifiant, choisir un autre nom, parce que le terme id est utilisé partout sur les pages html, et choisir un tel terme est le meilleur moyen pour semer la confusion dans la compréhension de ton code.
    oui tu as 100% raison.


    Grace à vous, j’ai mis mon id en string et ça fonctionne :
    Nom : 10180E36-3EB6-4109-9485-0CC78913E25F.jpeg
Affichages : 158
Taille : 53,5 Ko
    Je ne vous remercirai jamais assez

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/05/2010, 09h52
  2. modifier une variable de session via javascript
    Par DiverSIG dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/04/2010, 07h13
  3. [JSP] [Javascript] Modifier une variable de Session
    Par fady005 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 05/04/2007, 11h48
  4. [PHP-JS] Modifier une variable PHP en JavaScript
    Par Prenthès dans le forum Langage
    Réponses: 6
    Dernier message: 17/01/2007, 16h52
  5. [Javascript] modifier des variables a la fermeture du navigateur
    Par kespy13 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/05/2006, 14h35

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