Lorsque nous faisons Plafond (convertir (décimal, 8.09)) alors le résultat est 8 et au plafond (convertir (float, 8.09)) résultat est 9, expliquer?Plafond (convertir (décimal, décimalvalue)) vs Plafond (convertir (float, decimalvalue))
Répondre
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.
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?
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. –
+1 pour une réponse pertinente et pour être incroyablement altruiste. –
- 1. Convertir float en décimal dans Informix
- 2. Fonction de plafond dans Access
- 3. plafond le plus proche 50
- 4. Fonction plafond dans SharePoint CAML requête
- 5. Convertir décimal en ASCII
- 6. Convertir décimal <-> hex
- 7. Java - Convertir booléen [] en décimal
- 8. convertir décimal? en primitive decimal
- 9. Java convertir float en entier
- 10. Définition d'un plafond sur la balise Django widthratio
- 11. forcer un plafond à compter (*) en requête sql
- 12. échec du capistrano - où est défini le déploiement du plafond?
- 13. Comment arrondir/plafond/plancher un nombre bcmath en PHP?
- 14. Convertir string [] en Decimal [], int [], float [] .double [] en C#
- 15. convertir le nombre en décimal en php
- 16. Comment convertir un octet en décimal?
- 17. Comment convertir un champ COMP en décimal?
- 18. python: comment convertir une devise en décimal?
- 19. Convertir décimal en binaire en python
- 20. convertir Tableau décimal en tableau double
- 21. comment convertir décimal en binaire en C++
- 22. convertir décimal en int en C#
- 23. convertir float en entier dans prolog
- 24. python 2.5: comment convertir float en hexa?
- 25. Float ou décimal pour les prix?
- 26. Convertir une chaîne en entier avec décimal en Python
- 27. Utiliser PHP pour convertir un caractère ASCII en équivalent décimal
- 28. SQL Comment convertir un nombre décimal en une chaîne
- 29. Comment convertir minutes de deuxième degré en décimal en java
- 30. Comment convertir un nombre décimal en temps ou vice versa
+1. bonne explication –
Merci @Mitch Wheat, appréciez le commentaire et +1! –