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 :

Précision erronnée lors de Soustraction de flottant


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1
    Par défaut Précision erronnée lors de Soustraction de flottant
    Bonjour

    savez vous pourquoi lorsque je soustrais 31.62 à un flottant (dont la valeur est 3297.66) j'obtiens un resultat erroné
    alors que si je soustrais direstement 31.62 à 3297.66, le resultat est correct ?



    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
    public class Test {
    
    	public static void main(String[] args)  {
    		
    	float firstNb = (float) 3297.66;
    	float res;
    	
    	res = (float) (3297.66 - 31.62);
    	System.out.println(" res1 = "+res); //   res = 3266.04 - Ok
    
    
    	res = (float) (firstNb - 31.62);
    	System.out.println(" res2 = "+res); //   res = 3266.0398 - KO
    	
    	}
    	
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 35
    Par défaut
    ha ouais. marrant ca.

    mais si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res = (3297.66f - 31.62f);
    tu as le mauvais résultat aussi.

    Quand toi tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res = (float) (3297.66 - 31.62);
    ca marche parce que 3297.66 est alors défini comme un double.
    Mais c'est vrai, ca m'étonne qu'il n'y est pas assez de précision avec que des float.

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les flottants sont des approximations, et la qualité de leurs résultats dépend donc de leurs tailles.

    Si les floats ne propose qu'un précision réduite, les doubles proposent ainsi une bien meilleure précision amplement suffisante pour la plupart des applications.

    Dans ton cas le premier calcul s'effectue sur des doubles, ce qui fait que tu as un résultat correct, puis une conversion en float.

    Dans le second cas, tu as un calcul entres un float et un double, et donc une perte de précision qui amène à une approximation du résultat.


    Bref : utilises des doubles, ou si tu as de gros besoins de précision, passe aux BigDecimals


    Comment faire des calculs de précision corrects avec des floats ou des doubles ?

    a++

  4. #4
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Je pense que l'on voit clairement le problème en faisant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double nb1 = 3297.66f; // 3297.659912109375
    double nb2 = 31.62f; // 31.6200008392334
    double res = nb1 - nb2; // 3266.0399112701416
    float res2 = (float) res; // 3266.0398

Discussions similaires

  1. Précision machine lors d'une projection d'un vecteur sur un hyperplan
    Par lejusdorange dans le forum Mathématiques
    Réponses: 1
    Dernier message: 08/10/2014, 12h10
  2. Soustraction de float et perte de précision
    Par Gxouxou dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/06/2008, 16h08
  3. Choisir la précision pour calculs en nombres flottants
    Par ciol2.6.12 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/06/2008, 15h14
  4. Réponses: 3
    Dernier message: 01/08/2007, 13h49
  5. Réponses: 8
    Dernier message: 13/01/2003, 18h45

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