it-swarm.com.de

Warum werden meine Dezimalwerte in SQL-Einfügungen auf ganze Zahlen gerundet?

Ich verwende SQL Server Management Studio und habe das folgende Schema eingerichtet:

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

Dann führe ich folgende Einfügungen durch:

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

Erwartete Ausgabe:

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

Tatsächliche Ausgabe:

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

Warum werden die eingefügten Toleranzregion-Werte auf die nächste Ganzzahl gerundet?

8
Adam Freymiller

Sie haben keine Skala/Genauigkeit für Ihre Dezimalzahl definiert. Wenn Sie 3 Dezimalstellen nach dem Dezimalzeichen wünschen, sollten Sie es als DECIMAL (9,3) definieren, wodurch Sie 6 Stellen vor dem Dezimalzeichen und ein Dezimalzeichen von bis zu 3 Stellen erhalten. Sie müssen die erwarteten Daten analysieren und basierend auf dem, was Sie erwarten, die richtige Genauigkeit und Skalierung für Ihre Spaltendefinition angeben.

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

In der SQL Server-Dokumentation finden Sie hier dezimal .

10
Igor

Dies liegt daran, dass Sie scale nicht festlegen. Das System verwendet also die Standardskala von Null:

s (Skala) Die Anzahl der Dezimalstellen, die rechts vom Dezimalpunkt gespeichert werden. Diese Zahl wird von p abgezogen, um die maximale Anzahl von Stellen links vom Dezimalpunkt zu bestimmen. Die maximale Anzahl Dezimalstellen, die rechts vom Dezimalpunkt gespeichert werden kann. Die Skala muss einen Wert zwischen 0 und p haben. Die Skalierung kann nur angegeben werden, wenn die Genauigkeit angegeben ist. Die Standardskala ist 0 . (Betonung hinzugefügt)

Mit anderen Worten, SQL Server speichert null Stellen rechts vom Dezimalpunkt.

4
dasblinkenlight

Stellen Sie Ihre Präzision ein 

Dezimalzahl (18,4)

Das wären Dezimalzahlen 

2

Hier ist die Frage: Wie haben Sie die Genauigkeit der DECIMAL-Spalte definiert?

Wenn es DECIMAL (10, 2) ist, hat es insgesamt 11 Zahlen, von denen 2 Dezimalwerte sind (mit 2 Dezimalrunden bedeutet, dass 10.215 als 11.22 gespeichert wird und 11.214 11.21 wird).

Wenn es DECIMAL (10) ist, hat es keine Dezimalwerte und wird auf eine ganze Zahl gerundet.

In Ihrer Frage haben Sie toleranceRegion DECIMAL definiert, so dass es auf die nächste ganze Zahl gerundet wird, wenn Sie eine Tabelle wie deklarieren 

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

)

Dann wird es nicht gerundet und Sie erhalten das Ergebnis, wie Sie möchten 

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

ausgabe:

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

Hinweis: - Wenn Sie FLOAT oder DOUBLE PRECISION verwenden, müssen Sie nicht die Anzahl der Dezimalwerte angeben, es hat jedoch eigene Fehler.

Für weitere Details können Sie hier klicken