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 :

[SQL2005] Ecart de valeur selon sqlcmd.exe ou Sql Server Management


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [SQL2005] Ecart de valeur selon sqlcmd.exe ou Sql Server Management
    Je créer une table avec Sql Server Management Studio TabTmp et une colonne ColTmp de type float. J'ajoute une ligne et j'écris 1,19.
    Si je fais un select * from TabTmp depuis Sql Server Management Studio : il me retourne 1,19.
    Si je fais un select * from TabTmp depuis sqlcmd.exe : il me retourne 1,18999999999999.
    Pourquoi cet écart ?

    J'ai fait un script .sql que je lance avec sqlcmd.exe
    CREATE TABLE [dbo].[TabTmp2] ( [ColTmp] [float] NULL ) ON [PRIMARY] ;
    INSERT INTO [dbo].[TabTmp2] ([ColTmp]) VALUES (1.19) ;
    select * from TabTmp2

    Si je fais un select * from TabTmp2 depuis sqlcmd.exe : il me retourne 1,18999999999999.

    Ma question : pourquoi SQL Server 2005 enregistre 1,8999999999999999 au lieu de 1.19 ?
    Sqlcmd me semble le plus précis car il m'affiche bien les 10 décimales après la virgule , contrairement à Sql Server Management Studio qui masque les décimales et arrondi la valeur à 1,19

    Merci de votre aide
    Ami


    Serveur : Intel Xeon, SQL Server 2005
    Client : Amd 64 avec Sql Server Management Studio Express

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    c'est normal car un float est stocké en numeric (c a d int divisé par int)

    si tu veux t'affranchir des approximations fais un ROUND(valeur,nb décimales)

    A+
    serge
    Errare humanum est, perseverare diabolicum (Sénèque)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par serge0934
    c'est normal car un float est stocké en numeric (c a d int divisé par int) si tu veux t'affranchir des approximations fais un ROUND(valeur,nb décimales)

    Vous confirmez que SQL Server enregistre 1,18999999999 dans la base quand on lui demande d'y écrire que 1,19 ( ou 1,19000000000000000) ?

    Je ne trouve pas ca normal !
    Vraiment je ne comprend toujours pas ....

    Ami

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Aide en ligne de SQL Server (http://msdn2.microsoft.com/fr-fr/library/ms187912.aspx) :


    Les types de données float et real sont des types de données approximatifs. Le comportement de float et de real suit la spécification IEEE 754 sur les types de données numériques approximatifs.

    Les types de données numériques approximatifs ne stockent pas les valeurs exactes spécifiées pour de nombreux chiffres mais une approximation extrêmement précise de la valeur. Pour de nombreuses applications, l'infime différence qui existe entre la valeur spécifiée et l'approximation stockée n'est pas perceptible, sauf occasionellement. Les types de données float et real présentant un caractère approximatif, ne les utilisez pas lorsqu'un comportement numérique exact est requis, comme dans les applications financières, les opérations comprenant des arrondis ou les vérifications d'égalité. Utilisez plutôt les types de données integer, decimal, money ou smallmoney.

    Évitez d'utiliser les colonnes float ou real dans les conditions de recherche de la clause WHERE, plus particulièrement les opérateurs = et <>. L'idéal est de limiter les colonnes float et real aux signes de comparaison > ou <.

    La spécification IEEE 754 fournit quatre méthodes d'arrondi : arrondi à la valeur la plus proche, à la valeur supérieure, à la valeur inférieure et à zéro. Microsoft SQL Server 2005 utilise l'arrondi à la valeur supérieure. Toutes garantes de la précision, ces méthodes peuvent néanmoins créer des valeurs en virgule flottante légèrement différentes. Comme la représentation binaire d'un nombre en virgule flottante peut utiliser un des nombreux schémas d'arrondi autorisés, il est impossible de quantifier de manière fiable une valeur en virgule flottante.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Merci
    Merci rudib pour ce lien qui confirme que 1,19 et bien écrit 1.8999999999 dans SQL Server .
    Très cordialement
    Ami

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

Discussions similaires

  1. SqlPubWiz.exe et SQL Server 2008
    Par orafrance dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/07/2010, 10h50
  2. Réponses: 1
    Dernier message: 25/04/2008, 23h14
  3. Suppression des valeurs selon la date
    Par nefertari dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 08/01/2008, 10h26
  4. Réponses: 4
    Dernier message: 27/06/2007, 14h50
  5. Réponses: 1
    Dernier message: 21/06/2006, 12h31

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