J’ai vu des exemples dans lesquels decimal
est utilisé dans les projets NHibernate pour le mappage sur des colonnes de nombres entiers dans Oracle. En ce moment, j’utilise int
et long
dans mon programme.
Quels sont les avantages du decimal
sur int
/ long
? Est-ce que ça fonctionne mieux?
J’ai vu décimal utilisé au lieu de int / long dans divers exemples. J’essaie juste de comprendre pourquoi
C’est probablement parce que .NET decimal
et Oracle NUMBER
un peu meilleurs que long
et NUMBER
et vous donnent plus de flexibilité. Si, par la suite, vous ajoutez une échelle dans la colonne Oracle, vous ne devrez pas modifier le type de données si vous avez déjà utilisé la decimal
.
decimal
est certainement plus lent int
et long
puisque les deux derniers sont pris en charge par le matériel. Cela dit, vous devez graver une quantité importante de données pour que cela fasse une différence. Je pense toujours que vous devriez utiliser long
si c’est ce que vous avez à faire et que vous devriez également laisser les définitions de colonne de tableau représenter cela. NUMBER(18,0)
pour long
et ainsi de suite.
La raison pour laquelle la carte decimal
un peu meilleure est que la long
est de 64 bits et que la decimal
est de 128 bits.
.NET
Type: décimal
Portée approximative: ± 1,0 × 10 ^ −28 à ± 7,9 × 10 ^ 28
Précision: 28-29 chiffres significatifsType: long
Gamme: –9.223.372.036.854.775.808 à 9.223.372.036.854.775.807
Précision: 18 (19 pour ulong) chiffres significatifs
Oracle
NUMBER
défaut à 38 chiffres significatifs et à l’échelle 0 (entier).
Type: NUMBER
Gamme: + – 1 x 10 ^ -130 à 9,99 … 9 x 10 ^ 125
Précision: 38 chiffres significatifs
Microsoft est conscient du problème et note
Ce type de données est un alias pour le type de données NUMBER (38) et est conçu pour que OracleDataReader renvoie un System.Decimal ou OracleNumber au lieu d’une valeur entière. L’utilisation du type de données .NET Framework peut provoquer un débordement.
À bien y penser, vous avez besoin de BigInteger
pour représenter le même nombre de chiffres significatifs que NUMBER
défaut. Je n’ai jamais vu personne faire ça et je suppose que c’est un besoin très rare. De plus, BigInteger
ne le ferait toujours pas puisque NUMBER
peut être infini positif et négatif.
[.NET: Int32] = [Oracle:NUMBER(2)..NUMBER(9)*] [.NET: Int64] = [Oracle:NUMBER(10)..NUMBER(18)*] [.NET: Double] = [Oracle:NUMBER(x, 0)..NUMBER(x, 15)*] [.NET: Double] = [Oracle: FLOAT] [.NET: Decimal] = [Oracle:NUMBER]
NUMBER(1,0) => Boolean NUMBER(5,0) => Int16/short.MaxValue == 32767 NUMBER(10,0) => Int32/int.MaxValue == 2,147,483,647 NUMBER(19,0) => Int64/long.MaxValue == 9,223,372,036,854,775,807