web-dev-qa-db-fra.com

Pourquoi mes valeurs décimales sont-elles arrondies aux entiers dans les insertions SQL?

J'utilise SQL Server Management Studio et j'ai le schéma suivant en place:

CREATE TABLE tmp(
    id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
    toleranceRegion DECIMAL
)

Ensuite, j'effectue les insertions suivantes:

INSERT INTO tmp VALUES(3.2); 
INSERT INTO tmp VALUES(5.678);
INSERT INTO tmp VALUES(1.95);

Production attendue:

id  toleranceRegion
--  ---------------
1   3.2
2   5.678
3   1.95

Sortie réelle:

id  toleranceRegion
--  ---------------
1   3
2   6
3   2

Pourquoi les valeurs de toléranceRégion insérées sont-elles arrondies à l'entier le plus proche?

8
Adam Freymiller

Vous n'avez pas défini d'échelle/précision pour votre nombre décimal. Si vous voulez 3 chiffres après la décimale, vous devez le définir en tant que DECIMAL (9,3), ce qui vous donnerait 6 places avant la décimale et une décimale pouvant aller jusqu'à 3 places. Vous devez analyser les données attendues et, en fonction de vos attentes, spécifier la précision et l’échelle correctes pour votre définition de colonne.

CREATE TABLE tmp(
    id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
    toleranceRegion DECIMAL(9,3)
)

Voir la documentation de Sql Server pour décimal ici .

10
Igor

En effet, vous ne définissez pas scale , ce qui signifie que le système utilise l’échelle par défaut de zéro:

s (scale) Nombre de chiffres décimaux qui seront stockés à la droite du point décimal. Ce nombre est soustrait de p pour déterminer le nombre maximal de chiffres à gauche du point décimal. Nombre maximal de chiffres décimaux pouvant être stockés à droite du séparateur décimal. L'échelle doit être une valeur de 0 à p. L'échelle ne peut être spécifiée que si une précision est spécifiée. L'échelle par défaut est 0 . (emphase ajoutée)

En d'autres termes, SQL Server stocke zéro chiffre à droite du séparateur décimal.

4
dasblinkenlight

Définissez votre précision 

Décimal (18,4)

Ce serait des décimales 

2
John Cappelletti

Ici la question est comment avez-vous défini la précision de la colonne DECIMAL?

Si c'est DECIMAL (10, 2), il aura un total de 11 nombres dont 2 sont des valeurs décimales (avec 2 arrondis, ce qui signifie que 10.215 est enregistré en tant que 11.22 et que 11.214 devient 11.21).

Si c'est DECIMAL (10), il n'aura aucune valeur décimale et sera arrondi à un entier.

Dans votre question, vous avez défini toleranceRegion DECIMAL afin qu’il soit arrondi au prochain entier. Si vous déclarez une table comme 

CREATE TABLE tmp(
id int NOT NULL IDENTITY(1,1)PRIMARY KEY,
toleranceRegion DECIMAL(10,3)

)

Ensuite, il ne sera pas arrondi et vous obtiendrez le résultat que vous souhaitez. 

INSERT INTO tmp VALUES(3.2); 
INSERT INTO tmp VALUES(5.678);
INSERT INTO tmp VALUES(1.95);

sortie:

id  toleranceRegion
--  ---------------
1   3.2
2   5.678
3   1.95

Remarque: - Si vous utilisez FLOAT ou DOUBLE PRECISION, vous n'avez pas à spécifier le nombre de valeurs décimales, mais il a ses propres défauts.

Pour plus de détails, vous pouvez cliquez ici

0