2010-11-10 5 views

Répondre

2

A DECIMAL Type dans SQL Utilise un type de données numérique Precision au lieu d'un type de données numérique approximatif comme FLOAT. Ce que cela implique, c'est que les données stockent non seulement le nombre, mais aussi une dimension de précision, alors qu'en comparaison, un flottant est toujours un magasin d'approximation mis à l'échelle pour une valeur numérique.

Il y a 3 pièces à la précision DECIMAL, la valeur, le nombre P (pour la précision) et le nombre S (pour l'échelle). Le nombre P est le nombre maximum de chiffres que le type de données peut stocker, donc si j'ai un DECIMAL avec une précision de 4, je peux seulement aller jusqu'à 9999 ou aussi bas que 0,001. La valeur par défaut est 18 chiffres.

Le problème que vous rencontrez est votre numéro S. Le nombre S est la précision des nombres après le point décimal, une sorte de sous-ensemble maximum au-dessus du nombre P. Donc, une précision de S de 2 signifie que je peux avoir 0,01 à 0,99, la précision de 4 est de 0,0001 à 0,9999 et ainsi de suite. Cela en combinaison avec P peut conduire à une troncature si vous ne comptez pas pour les chiffres maximums. Donc, bien qu'une conversion du nombre 12345.12345 (P, S) = (6,3) devrait avoir les 3 chiffres décimaux (12345.123), les chiffres maximum sont 6 de sorte que vous vous retrouvez avec (12345.1) Afin d'avoir un numéro S le numéro P doit également être déclaré:

DECIMAL(P[,S]) 

de cette façon, en raison des limites de construction de P et S, P ne peut pas être plus petit que S et S non inférieure à 0 (vous ne pouvez pas avoir 14 décimales dans un certain nombre que les chiffres maximum est à seulement 5):

P >= [S] >= 0 

Pour résoudre votre problème, quand vous faites votre CONVERT, déclarez la façon précise dont vous avez besoin pour votre DEC iMAL d'être aussi, par défaut, la valeur S est réglée sur :

SELECT CONVERT(DECIMAL(18,6), 8.09) 

Voici quelques exemples pour montrer la précision, les exécuter et de voir comment ils fonctionnent:

SELECT CONVERT(DECIMAL(10,1) , 12.345678) --10 Maximum Digits, 1 Decimal Places (Expect round off) 

SELECT CONVERT(DECIMAL(18,3) , 12.2345)  --18 Maximum Digits, 3 Decimal Places (Expect 3rd decimal round up) 

SELECT CONVERT(DECIMAL(3,4) , 123.456789) --3 Maximum Digits, 4 Decimal Places (Expect 4th decimal round up, but get overflow error as P < S) 

SELECT CONVERT(DECIMAL(18,6) , 8.09)  --18 Maximum Digits, 6 Decimal Places (Expect no data change in precision) 

J'espère que cela vous aide, si possible utilisez toujours des décimales et spécifiez une précision où vous savez qu'il y a des limites. Il peut être plus efficace en fonction des données et de la nature de la procédure.

+1

+1. bonne explication –

+0

Merci @Mitch Wheat, appréciez le commentaire et +1! –

1

Ceci est un problème de précision.

Parce

convert(decimal,8.09) == 8 

alors

convert(float,8.09) == 8.09 

decimal a une précision par défaut de 18

float est float(53) (également synonyme de personnes) qui a une précision de 15 chiffres

Qu'essayez-vous de faire? Quel est le contexte?

+0

merci pour votre réponse, en fait je fais le réglage de la performance d'une grande procédure de magasin et j'ai trouvé une requête qui utilise cette conversion donc j'ai remplacé "float" avec décimale et voulait vérifier la performance, mais j'oublie de définir la précision eu un mauvais résultat si posé question. encore merci encore. –

+0

+1 pour une réponse pertinente et pour être incroyablement altruiste. –

Questions connexes