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

Développement SQL Server Discussion :

Type float et précision : solution "propre" pour m'en sortir ?


Sujet :

Développement SQL Server

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut Type float et précision : solution "propre" pour m'en sortir ?
    Bonjour,

    Je travaille avec un logiciel qui stocke, comme un goret, et comme tant d'autres… des prix et montants de commandes dans des colonnes de type "float" et non "decimal".

    Le programme, qui se contrefout royalement de toutes les formes normales qui soient, stocke dans l'entête de commande le montant de la commande, et sur les lignes, notamment le montant de la ligne (qui est bien évidement le résultat d'un calcul).

    Et vu que la vie est bien faite, le programme a foiré ses calculs, et bibi doit corriger à la main les données.

    Bref.

    Soit les deux tables suivantes :

    ENTETE (entete_id, total, valeur_brute)
    LIGNE (ligne_id, entete_id, quantite_vendue, quantite_gratuite, prix_unitaire, prix_total, valeur_totale)

    Lorsque je fais la requête suivante :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select ligne_id
    from ligne
    where (quantite_vendue + quantite_gratuite) * prix_unitaire <> valeur_totale

    J'ai des lignes.

    Sauf que 99% des lignes sont "visuellement" identiques. 12,5 dans les deux colonnes.
    Evidement, y'en a une qui doit être égale à 12,49999999999 et l'autre à 12,50000000001 donc elles ne sont pas égales.

    Idem lorsque je contrôle que la somme des lignes est égale au montant de l'entête.

    Je m'en suis sorti avec une pirouette à deux balles qui consiste à comparer non pas les valeurs dans leur type d'origine, mais les convertir à la volée en decimal(12,2) histoire que 12,5 = 12,5

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select ligne_id
    from ligne
    where cast((quantite_vendue + quantite_gratuite) * prix_unitaire as decimal(12,2)) <> cast(valeur_totale as decimal(12,2))

    Mais je trouve pas ça propre. Si par hasard j'ai un prix avec une précision non pas à deux décimales mais à 5, mon truc marche pas.
    Et caster à la volée toutes les données me semble relativement moyen…

    Je pensais aussi faire :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select ligne_id
    from ligne
    where abs((quantite_vendue + quantite_gratuite) * prix_unitaire - valeur_totale) > 0.000001

    Mais bon, ça devient juste plus lisible…

    Existe-t-il sous SQL Server un flag ou autre fonction qui transforme le "=" en "= au pouillème près" afin de faire abstraction des erreurs de précision du type float ?
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 769
    Points : 52 722
    Points
    52 722
    Billets dans le blog
    5
    Par défaut
    Et non ! "garbage in, garbage out" comme disent les ricains.. Traduisible par si tu as de la merde en entrée, tu fera de la merde en sortie.

    Assassine le crétin de développeur de ma part !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    à part filtrer where somme between montant - tolérance and montant+tolérance je ne vois pas

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