web-dev-qa-db-fra.com

Différence entre numeric, float et decimal dans SQL Server

J'ai cherché dans Google et j'ai aussi visité décimal et numérique et SQL Server Helper pour connaître la différence entre les types de données numeric, float et decimal et aussi pour savoir lequel devrait être utilisé. quelle situation.

Pour tout type de transaction financière (par exemple pour le champ de salaire), laquelle est préférée et pourquoi?

291
priyanka.sarkar

utilisez les types de données float ​​ou real uniquement si la précision fournie par décimal (jusqu'à 38 chiffres) est insuffisant

  • Les types de données numériques approximatifs ne stockent pas les valeurs exactes spécifiées pour de nombreux nombres ; ils stockent une approximation extrêmement proche de la valeur. ( Technet )

  • Évitez d'utiliser des colonnes float ou real dans les conditions de recherche de la clause WHERE, en particulier les opérateurs = et <> ( Technet )

généralement parce que la précision précision fournie par le nombre décimal est égale à [10E38 ~ 38 chiffres] si votre nombre peut y entrer, et qu'un espace de stockage plus petit (et peut-être plus rapidement) de Float n’est pas important et qu’il est important de traiter les comportements anormaux et les problèmes de types numériques approximatifs ne sont pas acceptables, utilisez Decimal en général .

informations plus utiles

  • numérique = décimal (5 à 17 octets) ( exact type de données numérique)
    • mappera vers Decimal dans .NET
    • les deux ont (18, 0) les paramètres par défaut (précision, échelle) dans le serveur SQL
    • scale = nombre maximum de chiffres décimaux pouvant être stockés à droite du point décimal.
    • veuillez noter que money (8 octets) et smallmoney (4 octets) sont également exacts et correspondent à Decimal In .NET et ont 4 points décimaux ( MSDN )
    • décimal et numérique (Transact-SQL) - MSDN
  • real (4 byte) ( approximatif type de données numérique)
  • float (8 byte) ( approximatif type de données numérique)
    • mappera vers Double dans .NET
  • Tous les types numériques exacts produisent toujours le même résultat, quel que soit le type d'architecture de processeur utilisé ou la magnitude des nombres
  • Le paramètre fourni au type de données float définit le nombre de bits utilisés pour stocker le mantisse du nombre à virgule flottante .
  • Le type de données numérique approximatif utilise généralement moins de stockage et a une meilleure vitesse (jusqu'à 20 fois). Vous devez également prendre en compte le moment de la conversion en .NET

Exact Numeric Data TypesApproximate Numeric Data Types

source principale : Kit de formation auto-rythmée du SCTM (Examen 70-433): Développement de bases de données Microsoft® SQL Server® 2008 - Chapitre 3 - Tableaux, types de données et intégrité des données déclaratives Leçon 1 - Choix des types de données (Recommandations) - Page 93

438
Iman Abidi

Instructions de MSDN: tilisation de données décimales, flottantes et réelles

La précision maximale par défaut des types de données numériques et décimaux est 38. Dans Transact-SQL, numérique correspond fonctionnellement au type de données décimal. Utilisez le type de données décimal pour stocker des nombres avec des décimales lorsque les valeurs de données doivent être stockées exactement comme spécifié.

Le comportement de float et real suit la spécification IEEE 754 sur les types de données numériques approximatifs. En raison de la nature approximative des types float et real, n'utilisez pas ces types de données lorsqu'un comportement numérique exact est requis, par exemple dans les applications financières, dans les opérations impliquant l'arrondi ou dans les contrôles d'égalité. À la place, utilisez les types de données entier, décimal, argent ou petit-argent. Évitez d’utiliser des colonnes float ou real dans les conditions de recherche de la clause WHERE, en particulier les opérateurs = et <>. Il est préférable de limiter les colonnes float et real aux comparaisons> ou <.

23
kmote

Pas une réponse complète, mais un lien utile:

"Je fais souvent des calculs en fonction des valeurs décimales. Dans certains cas, le fait de flotter rapidement des valeurs décimales, avant tout calcul, donne une meilleure précision."

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

12
A-K

Ils diffèrent par la priorité des types de données

Décimal et Numérique sont identiques sur le plan fonctionnel. mais il y a toujours la priorité du type de données , ce qui peut être crucial dans certains cas.

SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')

Le type de données résultant est numérique car il prend la priorité du type de données .

Liste exhaustive des types de données par priorité:

lien de référence

10
Stephan

La décimale a une précision fixe, tandis que float a une précision variable.

EDIT (impossible de lire toute la question): Float (53) (alias réel) est un nombre à virgule flottante double précision (32 bits) dans SQL Server. Regular Float est un nombre à virgule flottante simple précision. Double est une bonne combinaison de précision et de simplicité pour de nombreux calculs. Vous pouvez créer un nombre de très haute précision avec un nombre décimal - jusqu'à 136 bits - mais vous devez également veiller à définir correctement votre précision et votre échelle, afin qu'il puisse contenir tous vos calculs intermédiaires jusqu'au nombre de chiffres requis.

7
Brian Reiter

Float correspond au type de données Nombre approximatif, ce qui signifie que toutes les valeurs de la plage de types de données ne peuvent pas être représentées exactement.

Décimal/Numérique est un type de données de précision fixe, ce qui signifie que toutes les valeurs de la plage de types de données peuvent être représentées exactement avec précision et échelle. Vous pouvez utiliser décimal pour économiser de l'argent.

La conversion de décimale ou numérique en virgule flottante peut entraîner une perte de précision. Pour les types de données Decimal ou Numeric, SQL Server considère chaque combinaison spécifique de précision et d'échelle comme un type de données différent. DECIMAL (2,2) et DECIMAL (2,4) sont des types de données différents. Cela signifie que 11.22 et 11.2222 sont des types différents bien que ce ne soit pas le cas pour float. Pour FLOAT (6), les types 11.22 et 11.2222 sont identiques.

Vous pouvez également utiliser le type de données money money pour réaliser des économies. Il s'agit d'un type de données natif avec une précision de 4 chiffres pour de l'argent. La plupart des experts préfèrent ce type de données pour économiser de l'argent.

Référence 12

2
Somnath Muluk

Bien que la question n'inclue pas le type de données MONEY, certaines personnes rencontrant ce fil peuvent être tentées d'utiliser le type de données MONEY pour des calculs financiers.

Méfiez-vous du type de données MONEY, sa précision est limitée.

Il y a beaucoup de bonnes informations à ce sujet dans les réponses à cette question de Stackoverflow:

Si vous choisissez les types de données MONEY ou DECIMAL (x, y) dans SQL Server?

1
Simon Tewsi

Le cas de Decimal

Quel est le besoin sous-jacent?

Cela vient du fait que, en définitive, les ordinateurs représentent, en interne, des nombres au format binaire. Cela conduit inévitablement à des erreurs d'arrondis.

Considère ceci:

0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")

Ellipsis [...] signifie "infini". Si vous le regardez attentivement, il y a un motif répétitif infini (= '0011')

Donc, à un moment donné, l'ordinateur doit arrondir cette valeur. Cela conduit à des erreurs d’accumulation provenant de l’utilisation répétée de nombres inexactement stockés.

Supposons que vous souhaitiez stocker des montants financiers (des nombres pouvant contenir une fraction). Tout d’abord, vous ne pouvez évidemment pas utiliser d’entiers (les entiers n’ont pas de partie décimale). D'un point de vue purement mathématique, la tendance naturelle serait d'utiliser un float. Mais, dans un ordinateur, les nombres flottants ont la partie d’un nombre qui se situe après un point décimal - la "mantisse" - limitée. Cela conduit à des erreurs d'arrondi.

Pour résoudre ce problème, les ordinateurs offrent des types de données spécifiques qui limitent l'erreur d'arrondi binaire sur les ordinateurs pour les nombres décimaux. Ce sont les types de données qui doivent absolument être utilisés pour représenter des montants financiers. Ces types de données portent généralement le nom de Decimal. C'est le cas en C #, par exemple. Ou, DECIMAL dans la plupart des bases de données.

1
Varus Septimus