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 :

Limite de parseInt


Sujet :

JavaScript

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1
    Par défaut Limite de parseInt
    Bonjour a tous,
    voila, je rencontre un problème avec parseInt...

    voici l'exemple :
    je dois convertir 36106293432562436 de type String en int.

    j'utilise donc ceci :

    var tmp = parseInt(data.code, 10);

    data.code contient 36106293432562436 au format texte.

    la sortie est : 36106293432562430

    une idée ?

    merci d'avance.
    marc

  2. #2
    Expert confirmé
    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 : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Salut,
    c’est un subtil problème de précision. JavaScript n’a qu’un seul type "number" pour les nombres, qu’ils soient entiers ou flottants. En interne, le système de représentation est celui du standard IEEE 754. Sans entrer dans les détails, ce système est capable de représenter des entiers positifs sur 53 bits sans perte de précision. 53 bits permettent de représenter 253 nombres différents. Si on commence à 0, on peut donc aller jusqu’à 253 - 1. Cette limite est représentée par la constante Number.MAX_SAFE_INTEGER.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >> Number.MAX_SAFE_INTEGER
    9007199254740991
    JavaScript offre également une fonction pour tester facilement si ton nombre peut être représenté avec une précision parfaite ou pas : Number.isSafeInteger().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >> Number.isSafeInteger(36106293432562436)
    false
    Pour manipuler des grands nombres sans souffrir de pertes de précision, il faut tricher. On peut imaginer tout un tas de moyen de représenter des nombres sans utiliser le type "number" : en les « découpant » en plusieurs nombres, en les laissant sous forme de chaînes, en utilisant un tableau, etc. Mais du coup il faut réinventer les opérations mathématiques pour les faire fonctionner avec le système qu’on a choisi. Évidemment, on trouve des bibliothèques qui font ça à notre place, par exemple decimal.js, bignumber.js, big.js. Je viens de voir qu’il y avait aussi un futur standard BigInt.

    Si tu n’as pas besoin de faire de l’arithmétique avec ce nombre, le mieux est encore de le garder sous forme de chaîne.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    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 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 658
    Billets dans le blog
    1
    Par défaut
    Tu dépasses la taille max d'un integer pour js ...
    regarde du coté de BigInt() ...
    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 !

  4. #4
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 486
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 486
    Par défaut
    si tu veux d'autres subtilites rigolotes avec JS, j'ai commence une petite liste (copier/coller dans la console)
    Code javascript : 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
    31
    32
    33
    34
    35
    console.log('0.1+0.2==0.3 :\t', 0.1+0.2==0.3);
    console.log('0.1+0.2 :\t', 0.1+0.2);
    console.log('typeof NaN :\t', typeof NaN);
    console.log('NaN === NaN :\t', NaN === NaN);
    console.log('parseInt("Infinity") :\t', parseInt('Infinity'));
    console.log('parseInt("Infinity", 19) :\t', parseInt('Infinity', 19));
    console.log('parseInt(null, 4*6) :\t', parseInt(null, 4*6));
    console.log('parseInt(1/1999999) :\t', parseInt(1/1999999));
    console.log('null == 0 :\t', null == 0);
    console.log('null < 0 :\t', null < 0);
    console.log('null > 0 :\t', null > 0);
    console.log('null <= 0 :\t', null <= 0);
    console.log('null >= 0 :\t', null >= 0);
    console.log('document.all instanceof Object :\t', document.all instanceof Object);
    console.log('typeof document.all :\t', typeof document.all);
    console.log('document.all == null :\t', document.all == null);
    console.log('++[[]][+[]]+[+[]] :\t', ++[[]][+[]]+[+[]]);
    console.log('[1,2]+[2,3] :\t', [1,2]+[2,3]);
    console.log('[]+[] :\t', []+[]);
    console.log('[]+{} :\t', []+{});
    console.log('Array(10).join("a") :\t', Array(10).join('a'));
    console.log('Array(10).join("a"+1) :\t', Array(10).join('a'+1));
    console.log('Array(10).join("a"-1) :\t', Array(10).join('a'-1));
    console.log('(!+[]+[]+![]).length :\t', (!+[]+[]+![]).length);
    console.log('[6,-2,2,-7].sort() :\t', [6,-2,2,-7].sort());
    console.log('"test"===new String("test") :\t', 'test' === new String('test'));
    console.log('9999999999999998+1 :\t', 9999999999999998+1);
    console.log('9007199254741001 :\t', 9007199254741001);
    console.log('Math.max() :\t', Math.max());
    console.log('Math.min() :\t', Math.min());
    console.log('true === 1 :\t', true === 1);
    console.log('[] == 0 :\t', [] == 0);
    console.log('1+"1" :\t', 1+'1');
    console.log('1-"1" :\t', 1-'1');
    console.log('052 :\t', 052);
    tout est parfaitement logique, c'est juste pas le resultat auquel tu t'attends
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

Discussions similaires

  1. Limitation DirectSound
    Par Sub0 dans le forum DirectX
    Réponses: 1
    Dernier message: 28/02/2003, 11h21
  2. [Turbo Pascal] Limite de la mémoire virtuelle
    Par moon tiger dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 08/02/2003, 22h30
  3. Limiter le déplacement de la souris
    Par el_bouleto dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2002, 23h56
  4. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09
  5. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31

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