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 :

[Langage] Conversion double/long


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut [Langage] Conversion double/long
    Bonsoir,

    Je développe actuellement avec une JDK 1.4 sous Eclipse 3.1.
    J'ai le bout de code suivant :
    double puissance = Math.pow(10, 5);
    Double res = new Double(puissance*64.1);

    Lorsque je passe en mode debug et que je regarde la valeur de puissance*64.1, il me trouve que cela fait 640999.9999...
    En regardant un peu sur le net, il semblerait qu'il s'agisse d'un pb de taille des type primitifs de Java et certains préconisent d'utiliser un long.
    Pourtant les long aussi bien que les double sont stockés sur 8 octets...

    En gros, j'aimerais savoir comment obtenir 6410000, car là je ne vois pas.
    Merci d'avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Tu peux :
    - utiliser un DecimalFormat pour ne garder que la partie entière
    - utiliser les méthodes de la classe java.lang.Math
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut [Re] [Langage] Conversion double/long
    Pourrais-tu être un peu plus précis stp???

  4. #4
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    Le plus simple dans ton cas est tout simplement de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Double res = new Double(6.41e6);
    Mais sache que les Float/Double sont des nombres à virgule flottante. Si tu les utilises, il faut être conscient que tu la plupart des calcul peuvent aboutir finissent sur une valeur approchée, même certains calculs qui sembleraient naturellement donner une valeur exacte pour un nombre décimal(car les nombre même en virgule flottante sont traités en binaires)

    Si tu veux des calculs avec des nombres décimaux, regarde du coté de la classe BigDécimal.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Hakim93210 Voir le message
    Pourtant les long aussi bien que les double sont stockés sur 8 octets...
    Ils peuvent donc tous les deux prendre le même nombre de valeurs différentes. Cependant, un long peux prendre des valeurs situées entre 2^63-1 et -2^64, par pas de 1. Les calculs dans ce range, en nombres entiers sont toujours exacts.

    un double peux prendre des valeurs situées presque entre 2^1024 et -2^1024, le tout en pouvant atteindre des chiffres derrière la virgule aussi petit que 2^-1074. La valeur stockées dans le double est toujours la valeur la plus proche possible de la valeur demandé, ce qui implique, pour chaque calcul, une approxmation, car on a jamais la garantie que le résultat d'un calcul peux être stocké de manière exacte dans un double (nos mathématiques travaillent sur base décimal, les floats sur base binaire). Exemple de code:
    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
     
    		double d;
    		NumberFormat nf = new DecimalFormat("##.############################");
    		System.out.println("avec float");
    		System.out.println("Valeur de 1/2: "+nf.format(0.5f));
    		System.out.println("Valeur de 0.1: "+nf.format(0.1f));
    		System.out.println("Valeur de 0.3: "+nf.format(0.3f));
    		System.out.println("Valeur de 0.7: "+nf.format(0.7f));
    		System.out.println("Valeur de 100000.1: "+nf.format(100000.1f));
    		System.out.println("Valeur de 100000.3: "+nf.format(100000.3f));
    		System.out.println("Valeur de 100000.7: "+nf.format(100000.7f));
    		System.out.println("Valeur de 1000000000.1-1000000000: "+nf.format(1000000000.1f-1000000000f));
    		System.out.println("Valeur de 100000000000000000000000000000000000000.1f: "+nf.format(100000000000000000000000000000000000000.1f));
    		System.out.println("avec double");
    		System.out.println("Valeur de 1/2: "+nf.format(0.5));
    		System.out.println("Valeur de 0.1: "+nf.format(0.1));
    		System.out.println("Valeur de 0.3: "+nf.format(0.3));
    		System.out.println("Valeur de 1000000000.1-1000000000: "+nf.format(1000000000.1-1000000000));
    		System.out.println("Valeur de 100000000000000000000000000000000000000.1: "+nf.format(100000000000000000000000000000000000000.1));
    avec sa sortie
    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
    avec float
    Valeur de 1/2: 0,5
    Valeur de 0.1: 0,10000000149011612
    Valeur de 0.3: 0,30000001192092896
    Valeur de 0.7: 0,699999988079071
    Valeur de 100000.1: 100000,1015625
    Valeur de 100000.3: 100000,296875
    Valeur de 100000.7: 100000,703125
    Valeur de 1000000000.1-1000000000: 0
    Valeur de 100000000000000000000000000000000000000.1f: 99999996802856920000000000000000000000
    avec double
    Valeur de 1/2: 0,5
    Valeur de 0.1: 0,1
    Valeur de 0.3: 0,3
    Valeur de 1000000000.1-1000000000: 0,10000002384185791
    Valeur de 100000000000000000000000000000000000000.1: 100000000000000000000000000000000000000
    j'ai utilisé des float pour montrer l'appoximation de stockage de la valeur (c'est le même en double, mais comme il y a beaucoup plus de décimale, impossible de l'afficher avec numberformat :p). Par contre tu notera que les erreurs de calculs apparaissent dans les deux cas. En pratique, avec les double si tu fais correctement tes calculs en tenant compte des précisions à chaque fois, l'arrondi d'affichage devrait suffire. J'ai dit devrais

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Tjs le mm pb...
    Salut à tous,

    Tout d'abord, merci pour vos réponses... Et merci à toi tchize_ pour cette comparaison entre les float et les double et leur stockage.
    Pourtant en utilisant correctement les double, j'ai tjs du mal a cerner pourquoi lorsque je fais
    System.out.println(new Double(14.1+5.023).toString());
    j'obtiens 19.122999999999999888

    Comment faire pour obtenir tout simplement 19.123??lol
    J'ai beau passer par des BigDecimal, ben ca marche pas

    J'ai fais
    System.out.println(new BigDecimal(14.1+5.023).toString());
    et j'obtiens le même résultat.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Hakim93210 Voir le message
    Pourtant en utilisant correctement les double, j'ai tjs du mal a cerner pourquoi lorsque je fais
    System.out.println(new Double(14.1+5.023).toString());
    j'obtiens 19.122999999999999888
    Parce que toString() n'effectue aucun arrondi et affiche la valeur brut.

    Pour arrondir tu peux simplement utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	double d = 14.1 + 5.023;
    	NumberFormat nf = new DecimalFormat("0.000"); // 3 chiffres après la virgule
    	System.out.println(nf.format(d));
    Citation Envoyé par Hakim93210 Voir le message
    J'ai beau passer par des BigDecimal, ben ca marche pas

    J'ai fais
    System.out.println(new BigDecimal(14.1+5.023).toString());
    et j'obtiens le même résultat.
    Parce que tu utilises un BigDecimal initialisé avec un double, et donc tu conserve l'approximation...

    Si tu veux un résultat correct il faut à la base avoir des données corrects, donc soit utiliser des types précis (int/long) soit utiliser une String qui sera correctement décodé par le BigDecimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	BigDecimal number = new BigDecimal("14.1").add(new BigDecimal("5.023"));
    	System.out.println(number);
    a++

Discussions similaires

  1. conversion double/long possible?
    Par filor dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2007, 17h51
  2. Pb de conversion: double[] vers un vector type???
    Par hycsos dans le forum SL & STL
    Réponses: 4
    Dernier message: 15/01/2006, 07h59
  3. Conversion Lat/Long vers UTM
    Par efficks dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 12/12/2005, 17h13
  4. Réponses: 3
    Dernier message: 12/05/2005, 12h10
  5. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05

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