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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    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
    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
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    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.

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

    Informations professionnelles :
    Activité : Développeur Java

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

  5. #5
    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
    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.

  6. #6
    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
    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

+ 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, 15h58
  2. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 10h46
  3. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 15h00
  4. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 12h07
  5. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49

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