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

Requêtes et SQL. Discussion :

Problème d'arrondi avec les champs de type réel simple [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Problème d'arrondi avec les champs de type réel simple
    Bonjour,

    Access est tout simplement incapable d'arrondir un champ de type réel simple à deux décimales :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -------------
    |   value   |
    -------------
    | -44,51234 |
    |  45,54124 |
    -------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND(valeur,2) FROM test;
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ---------------------
    |       value       |
    ---------------------
    | -44,5099983215332 |
    |  45,5400009155273 |
    ---------------------

    Une idée d'où peut venir le problème ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    Depuis la version Access 2.0 (pas de fonction arrondi), j'ai pris l'habitude de créer ma propre fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function arrondir(valeur, nbdec)
        arrondir = Int(valeur * (10 ^ nbdec) + 0.5) / 10 ^ nbdec
    End Function
    En fait j'ai jamais compris comment access faisait ces calculs

  3. #3
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    Je pense que le choix "réel simple" ne concerne que les champs stockés dans les tables et le variables déclarées explicitement. Sinon par défaut Access met des réels doubles partout.

    Dans la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND(valeur,2) FROM test;
    il n'y a pas de déclaration explicite des variables, il est donc probable qu'à un moment access fait une conversion malheureuse des valeurs depuis un réel simple vers un réel double

    Comme l'espace disque est de moins en moins cher je ne mets plus que des réels doubles partout et je n'ai plus ce type de problème

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Points : 1 282
    Points
    1 282
    Par défaut
    Bonjour
    Citation Envoyé par nico84 Voir le message
    Bonjour,

    Je pense que le choix "réel simple" ne concerne que les champs stockés dans les tables et le variables déclarées explicitement. Sinon par défaut Access met des réels doubles partout.

    Dans la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND(valeur,2) FROM test;
    il n'y a pas de déclaration explicite des variables, il est donc probable qu'à un moment access fait une conversion malheureuse des valeurs depuis un réel simple vers un réel double

    Comme l'espace disque est de moins en moins cher je ne mets plus que des réels doubles partout et je n'ai plus ce type de problème
    Histoire de ne pas mourir idiot j'ai fait des tests
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
        Dim v1 As Single
        Dim v2 As Double
        Dim r1 As Double
        Dim r2 As Double
        v1 = 45.54124
        v2 = 45.54124
        r1 = Round(v1, 2)
        r2 = Round(v2, 2)
        Debug.Print "r1: " & r1 & "-- r2 :" & r2
        'résultat
        'r1: 45,5400009155273-- r2 :45,54
        ' ???
    End Sub
    Maintenant je sais d'où ça vient. Merci nico84

    Edit encore plus bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
        Dim v1 As Single
        Dim r1 As Double
        v1 = 45.54124
        r1 = v1
        Debug.Print "r1: " & r1
        'résultat
        'r1: 45,5412406921387
        ' ???
    End Sub

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par nico84 Voir le message
    il n'y a pas de déclaration explicite des variables, il est donc probable qu'à un moment access fait une conversion malheureuse des valeurs depuis un réel simple vers un réel double
    Effectivement, une conversion forcée en double résout le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Round(CDbl(valeur),2) FROM test;

  6. #6
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    Les types de données single et double sont des approximations :
    http://msdn.microsoft.com/fr-fr/library/ae382yt8.aspx

    Pour stocker précisémment un nombre decimal il faut utiliser le type de données currency (decimal)

  7. #7
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Edit encore plus bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
        Dim v1 As Single
        Dim r1 As Double
        v1 = 45.54124
        r1 = v1
        Debug.Print "r1: " & r1
        'résultat
        'r1: 45,5412406921387
        ' ???
    End Sub
    Ce n'est bizarre que pour un matheux
    Quand access met une valeur issue d'un réel simple dans un réel double il ajoute ce qu'il veut derrière au petit bonheur des conversions binaires

  8. #8
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par nico84 Voir le message
    Quand access met une valeur issue d'un réel simple dans un réel double il ajoute ce qu'il veut derrière au petit bonheur des conversions binaires
    Non je crois qu'il ne rajoute rien...et surtout il n'y a pas de hasard.
    Après conversion en double, on a la même chose que le single dans la mémoire :

    Single est stocké ainsi : 01000010001101100010101000111011
    exposant => (128+4) - 127 = 5
    mantisse => 1 + 1/2^2 + 1/2^4 + ... + 1/2^23 = 1.42316377162933
    Double est stocké ainsi : 0100000001000110110001010100011101100000000000000000000000000000
    exposant => (1024+4) - 1023 = 5
    mantisse => 1 + 1/2^2 + 1/2^4 + ... + 1/2^23 = 1.42316377162933

    45.54124 est donc approximé par :
    1.42316377162933 * 2^5 = 45.5412406921386

    Que ce soit en Single ou en Double.

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

Discussions similaires

  1. [AC-2007] SomDom avec un champ de type Réel: problème de virgule
    Par yupyupxav dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/12/2013, 20h46
  2. [MySQL] Problème d'insert avec un champ de type DateTime
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/05/2009, 03h45
  3. problème de sélection avec les champs vides
    Par danathane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/08/2007, 16h45
  4. Réponses: 8
    Dernier message: 16/08/2006, 14h39
  5. Problème avec les champs de type table
    Par devdev dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/12/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