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 :

Types/Primitives et Casting


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut Types/Primitives et Casting
    S'il vous plait je suis nouveau en Java et je plante au niveau des Types/Primitives et du Casting
    Lorsque j'écris par exemple
    long i = 21474836409; par exemple, jai un message d'erreur, c'est normal.
    Le document que je lis m'explique que les valeurs littérales entières sont, par défaut, de type int. Ainsi, pour compiler la ligne ci-dessus, Java tente d'abord d'affecter la valeur littérale à un int
    avant d'effectuer un casting vers un long. C'est l'affectation de la valeur à un int qui produit l'erreur de compilation, car la valeur littérale est trop grande pour un int. Il aurait fallu écrire :
    long i = 21474836409L;

    Voici mes questions:

    1) Cela signifie qu'il faudra que je maitrise tous les types Java (int, double, float, byte..) avec leur intervalle de valeur ??
    par exemple pour savoir que 21474836409 n'est pas un int il faudra que je maitrise intervalle des int, et ceci pour toutes les variables ?

    2) C'est ici le vrai problème: Comment faire donc dans mon application qui doit utiliser de gros chiffre et faire de gros calcul ? Si je dois écrire 21474836409 il faudra a tout que j'écrive 21474836409L ? Que faire si j'ai pas besoin du L dans mes résultats ?

    Un double ou un float se termine toujours par .0 ou par f et par d (5.5 ; 5.5f ou 5.5d). Comment faire si je ne veux pas de point ou de lettre a la fin de mon résultat.

    Merci

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    "Comment faire si je ne veux pas de point ou de lettre a la fin de mon résultat."

    --> Il n'y en aura pas plus qu'avant

    J'entends par la que la quesiton, je pense, ne se pose pas.

    Tu ecris des L et ou des .0 ou des f quand tu ecris dans le code.

    Si tu fait

    Syserr.println("Valeur="+tavariable); qu'elle soit float, long, ou int, tu n'aurais ni L ni .0 ni f.

    Ce n'est qu'une question d'affichage après...

    Et oui il vaut mieux connaitre les intervalles c'est primordial. Selon ce que tu traites comme type de chiffres, un type conviendra mieux qu'un autre.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Bonjour,

    Avec chaque type primitif tu as un type generique correspondant.

    Si tu veux être sûr que ta valeur est un long. Tu utilises Long.parseLong("ma valeur");

    Si tu obtiens un NumberFormatException, tu n'as pas un long.
    De même pour tout le reste Integer, Byte etc ...

    Pour les 'gros chiffres' va faire un tour du coté de l'api java.math
    Car les objets BigDecimal et BigInteger vont peut-être te convenir.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par mesken Voir le message
    par exemple pour savoir que 21474836409 n'est pas un int il faudra que je maitrise intervalle des int, et ceci pour toutes les variables ?
    Ben non, suffit de connaitre les notations, et quand vous affectez une valeur immediate à un long, vous mettez d'office le L

    2) C'est ici le vrai problème: Comment faire donc dans mon application qui doit utiliser de gros chiffre et faire de gros calcul ? Si je dois écrire 21474836409 il faudra a tout que j'écrive 21474836409L ? Que faire si j'ai pas besoin du L dans mes résultats ?
    Le L n'est qu'un indicateur pour le compilateur. La jvm utilise uniquement les type déclaré. Le L n'apparaîtra nulle part à l'exécution, il n'existera plus.

    Un double ou un float se termine toujours par .0 ou par f et par d (5.5 ; 5.5f ou 5.5d). Comment faire si je ne veux pas de point ou de lettre a la fin de mon résultat.
    Il n'y aura jamais de lettre, cf mon point ci dessus. Quand à arrondir avant la virgule, regardez du coté de la classe NumberFormat

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    Merci beaucoup.
    Mais je ne sais pas ce qui se passe par rapport aux .0 dont je parle, lorsque je fait
    float a=5; (je travaille avec Eclipse)
    Le résultat est le suivant System.out.println(a); Il m'affiche 5.0
    de même pour :
    double b=8;
    System.out.println(b); Il m'affiche 6.0

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Si tu mets 8 et qu'il t'affiche 6.0 effectivement y'a un gros souci

    Non c'est logique float et double sont des nombre a virgules donc forcement System.err.println() va automatiquement (si je peux dire) t'afficher avec une virgule.

    Il faut que tu comprennes qu'il y'a une différence entre la valeur stockée en mémoire (le chiffre réel), et sa représentation à l'écran...
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je déteste me répéter
    Citation Envoyé par tchize_ Voir le message
    Quand à arrondir avant la virgule, regardez du coté de la classe NumberFormat

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    Merci,

    Désolé, tchize, de te faire te répéter, j'ai bien vu ton message, c'est simplement que je m'intéresse beaucoup au pourquoi des choses. Je sais que la maitrise du pourquoi me donnera facilement accès au comment.
    Le pourquoi du comment et non le comment du pourquoi

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Parce que System.out.println() ne te propose pas de choisir comment afficher les choses.

    - Pour les objets, il utilise leur méthode toString() et se fiche du reste.
    - Pour les float, il utilise Float.toString(float), et ça non plus ça ne te propose pas de choisir comment faire.

    Autrement dit, quand Java a été créé, on a choisi une manière par défaut de représenter les float. C'est celle qui affiche .0 à la fin même s'il n'y a pas de chiffre après la virgule.

    Si cette manière ne te convient pas, tu peux choisir comment transformer tes nombres en String, en utilisant un NumberFormat ou bien en utiliser la forme %f de System.format().
    println() ne transforme les float en String que de la manière par défaut.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 342
    Par défaut
    Merci beaucoup les gars, je suis satisfait.

Discussions similaires

  1. Type safety: Unchecked cast from List to List<*>
    Par Altenide dans le forum Langage
    Réponses: 9
    Dernier message: 30/06/2011, 15h38
  2. Réponses: 2
    Dernier message: 05/01/2010, 11h21
  3. champ nullable type primitive
    Par Cammie dans le forum Hibernate
    Réponses: 2
    Dernier message: 09/03/2007, 16h26
  4. [héritage] cast avec le type de base
    Par Lere dans le forum C++
    Réponses: 6
    Dernier message: 16/09/2004, 18h21

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