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

Java Discussion :

Caste de la famille 5000.44


Sujet :

Java

  1. #1
    Membre actif Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Points : 278
    Points
    278
    Par défaut Caste de la famille 5000.44
    Bonjour,

    est ce que qu'elle qu'un peut m'expliquer pour quoi le caste en int après la multiplication par 100 de ces double : 5000.1,5000.11,5000.12,5000.21,5000.44, ce passe mal?

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Il serait intéressant de voir le code et l'erreur associée.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    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
    Parce que les dixièmes ne se représentent pas bien en virgule flottante qui utilise des puissance de 1/2 et que le cast vers int abandonne la partie décimale au lieu de faire un arrondi:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Main {
     
    	public static void main(String[] args) { 
    		double[] ds = {5000.1,5000.11,5000.12,5000.21,5000.44};
    		for (double d: ds) {
    			double val = (d*100);
    			int i = (int)(val);
    			int j = (int) Math.round(val);
    			System.out.printf("%.15f*100.0 -> %.15f. (int)=%d (round)=%d\n",d,val,i,j);
    		}
    	}
     
    }
    Sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    5000,100000000000000*100.0 -> 500010,000000000060000. (int)=500010 (round)=500010
    5000,110000000000000*100.0 -> 500010,999999999940000. (int)=500010 (round)=500011
    5000,120000000000000*100.0 -> 500012,000000000000000. (int)=500012 (round)=500012
    5000,210000000000000*100.0 -> 500021,000000000000000. (int)=500021 (round)=500021
    5000,440000000000000*100.0 -> 500043,999999999940000. (int)=500043 (round)=500044
    pour 5000.44 ca représente une erreur de calcul de ~1.16E-14%, ce qui est dans la tolérance des doubles

  4. #4
    Membre actif Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Points : 278
    Points
    278
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void main(String[] args) {
    		double a = 5000.11;
    		int b = (int)(a*100);
    		System.out.println(b);
    	}
    le résultat c'est 500010 au lieu de 500011, si on refait le test avec 6000.11 on a le bon résultat.

  5. #5
    Membre actif Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Points : 278
    Points
    278
    Par défaut
    y'a t'il un lien qui résume les erreur de ce type?

  6. #6
    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
    c'est dans à peu près tous les cours sur les flottants:
    -> Les flottants sont des approximations en virgule flottante de nombres réels
    -> Les flottant sont composé d'une mantise et d'un exposant, la mantise et l'exposant étant chacun représenté sous forme d'un somme de puissance de 2 (1/2 pour les puissance négative).

    Après, les cours de maths te diront que certains nombres ayant une réprésentation à virgule finie dans un base N n'ont pas nécessairement une représentation finie dans une base M. Ce qui implique inévitablement une perte de précision lors du passage de l'un à l'autre (décimale -> binaire -> décimale)

    ainsi 1.1 (c'est à dire 1+1/10) en décimal deviens en hexadecimal 1.1999999999999999... 1+1/F + 1/FF + 9/FFF + 9/FFF + 9/FFFF + 9 / FFFFF + 9/FFFFFF + .....

    C'est bel et bien la meme valeur, mais comme l'ordinateur est obligé de se limiter en nombre de décimal (stockage oblige), il dois couper à un moment donné et ça deviens pour lui 1.199999999999a, qui n'est plus tout à fait le meme nombre.

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

Discussions similaires

  1. [VB.NET] Cast d'une tablecell
    Par Pari dans le forum ASP.NET
    Réponses: 6
    Dernier message: 05/05/2004, 16h58
  2. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 11h46
  3. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 16h00
  4. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 13h07
  5. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 16h49

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