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

MS SQL Server Discussion :

arrondis float inaccepables


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut arrondis float inaccepables
    Bonjour

    Je suis confronté a un problème d'arrondi
    Je ne sais pas si le probleme vient du type de données ou de conversion

    Dans une table j'ai deux float
    223,92
    97,76

    Je lis ces float en Csharp / ADO

    Je retrouve bien deux float Csharp : 223,92 et 97,76
    Je resauve ces données dans une autre table et voici ce que j'obtiens !

    Est-il possible d'eviter cela ?

    QT TpUnite PrixNet
    223,919998168945 M2 9,76000022888184


    Merci de votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Je soupçonne fort une différence de mantisse entre le type float de C# et le type float de SQL Server.

    Regardez la table suivante : je crois qu'il faudrait que vous utilisiez un Double en C# ...

    Notons au passage que le type de données float de SQL Server n'est pas un type de données précis.
    Il vaut mieux donc utiliser le type numeric ou decimal.

    En revanche je ne comprend pas d'où vient la différence entre 97,76 et 9,76000022888184 (divisé par un peu plus 10 ?)

    @++

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par elsuket Voir le message
    En revanche je ne comprend pas d'où vient la différence entre 97,76 et 9,76000022888184 (divisé par un peu plus 10 ?)
    @++
    Sans doute une difference d'exposant sur mon clavier

    Merci Elsuket et merci pour ce tableau,

    Je vais travailler en double dans C#

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    A votre place :

    - Je changerai le type des deux colonnes vers numeric ou decimal : une quantité et un prix sont des valeurs précises

    - Je changerai le type de données C# en conséquence pour utiliser Decimal, comme indiqué par la table

    @++

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par elsuket Voir le message
    - Je changerai le type des deux colonnes vers numeric ou decimal : une quantité et un prix sont des valeurs précises
    Pour un prix oui, mais pas pour une quantité.
    Par exemple si la "quantité" est au litre ou au poids et que vous achetez de l'or ou du safran, les décimales feront toutes la différence !!!!!

    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/ * * * * *

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Notons au passage que le type de données float de SQL Server n'est pas un type de données précis.
    Mais c'est normalisé !
    Il vaut mieux donc utiliser le type numeric ou decimal.

    En revanche je ne comprend pas d'où vient la différence entre 97,76 et 9,76000022888184 (divisé par un peu plus 10 ?))
    Problème récurent dux aux IHM (notamment VB) et à divers paramétrages (style régionale.....).

    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/ * * * * *

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,
    [...]
    Notons au passage que le type de données float de SQL Server n'est pas un type de données précis.
    Il vaut mieux donc utiliser le type numeric ou decimal.
    [...]
    C'est une idée fausse assez répondue de dire que le type float n'est pas précis. Tout dépend de l'utilisation que l'on fait. Ci-dessous un exemple où le type float s'avère plus précis !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @float1 float, 
            @float2 float, 
            @float3 float,
            @float4 float;
     
    SET @float1 = 145;
    SET @float2 = 0.07;
    SET @float3 = @float1/@float2;
    SELECT @float3 / @float1 * @float2  AS "Doit être égale à 1";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Résultat : 
    Doit être égale à 1
    1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @decimal1  decimal(12,4),
            @decimal2  decimal(12,4),
            @decimal3  decimal(12,4),
            @decimal4  decimal(12,4); 
     
    SET @decimal1 = 145;
    SET @decimal2 = 0.07;
    SET @decimal3 = @decimal1/@decimal2;
    SELECT @decimal3 / @decimal1 * @decimal2  AS "Doit être égale à 1";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Résulat 
    Doit être égale à 1
    1.00000001379310345
    Je ne veux surtout pas dire qu'il faut utiliser le type float au lieu de décimal, ni l’inverse. Chacun des 2 types a son utilité. le type float peut être un bon choix pour les calculs scientifiques puisqu'il permet des mesures aussi proche de la réalité (plus précis !). le type decimal peut être approprié pour les chiffres ayant un nombre fixe de décimal tels que les montants exprimés en devise.

    Autre chose, transformer un type float en décimal est légitime et cela peut être un bon choix en rapport avec l’utilisation que vous en faites, mais attention, ce n'est pas transparent pour votre application. Je veux dire que ce n'est pas anodin et que cela peut générer des erreurs et des régressions dans votre application.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @decimal1 decimal(8,4), @decimal2 decimal(8,4), @decimal3 decimal(8,4);
    SET @decimal1 = 47;
    SET @decimal2 = 0.002;
    SET @decimal3 =  @decimal1 / @decimal2;
    SELECT @decimal3 / @decimal1 * @decimal2 AS "Doit être égale à 1";
    Résulat :
    Msg*8115, Niveau*16, État*8, Ligne*4
    Une erreur de dépassement arithmétique s'est produite lors de la conversion de numeric en type de données numeric.


    alors qu'en utilisant le type float le programme ne générait aucune erreur !

    A+

  8. #8
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bon !

    Et bien merci pour ces enseignement !

    je vais donc maintenant me battre pour essayer de trouver la meilleure combinaison possible afin de stocker en DB des quantité a 4 décimale et des valeurs a deux decimales et manipuler celles ci correctement en C#

    Ca ne semble hélas pas trivial mais d'apres ce que je comprends le bon choix serait peut etre de travailler en Decimal des deux cotés (Sql Server et C#)

    Personnelement je n'ai jamais travaillé en Décimal qui me semblait un type batard par raport au double ou au float !

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Pour ma part je n'utilise ni float (aucun calcul scientifique dans l'application sur laquelle je travaille) et surtout jamais le pseudo-type money, qui lui par contre produit des erreurs de calcul bien connues.

    @++

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonjour Elsuket
    Effectivement j'avais déja constaté que Money est a proscrire
    Par contre quand je suis en C# j'utilise généralement les doubles

    Que me conseillerais tu en définitive pour assurer un bon dialogue avec SQL Server ?
    decimal partout ?

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

Discussions similaires

  1. pb d'arrondi du champs float(p)
    Par mastersoiree dans le forum SQL
    Réponses: 2
    Dernier message: 01/10/2007, 16h05
  2. float, double et arrondi
    Par simla dans le forum Langage
    Réponses: 2
    Dernier message: 25/08/2007, 15h22
  3. Arrondi et Float
    Par kiwwi209 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/08/2006, 15h00
  4. Réponses: 2
    Dernier message: 07/07/2006, 19h59
  5. float arrondi depuis un fichier
    Par anasama dans le forum C++
    Réponses: 6
    Dernier message: 24/01/2006, 17h23

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