Wie interpretiere ich die Genauigkeit und Skalierung einer Zahl in einer Datenbank?

245

Ich habe die folgende Spalte in einer Datenbank angegeben: dezimal (5,2)

Wie interpretiert man das?

Anhand der Eigenschaften in der Spalte, die in SQL Server Management Studio angezeigt werden, kann ich sehen, dass dies bedeutet: dezimal (numerische Genauigkeit, numerische Skala).

Was bedeuten Präzision und Skalierung real?

Es wäre einfach, dies als Dezimalstelle mit 5 Stellen und zwei Dezimalstellen zu interpretieren ... dh 12345.12

PS Ich konnte die richtige Antwort von einem Kollegen ermitteln, hatte jedoch große Schwierigkeiten, online eine Antwort zu finden. Daher möchte ich, dass die Frage und Antwort hier im Stackoverflow dokumentiert werden, damit Sie später darauf zurückgreifen können.

Mezoid
quelle

Antworten:

396

Die numerische Genauigkeit bezieht sich auf die maximale Anzahl von Ziffern, die in der Anzahl vorhanden sind.

dh 1234567.89 hat eine Genauigkeit von 9

Die numerische Skala bezieht sich auf die maximale Anzahl von Dezimalstellen

dh 123456.789 hat eine Skala von 3

Somit beträgt der maximal zulässige Wert für die Dezimalstelle (5,2) 999,99

Mezoid
quelle
14
Vergessen Sie nicht, dass Sie bei Verwendung eines Systems, mit dem Sie die Genauigkeit und Skalierung einer Eingabe für einen Prozentsatz in Microsoft Access vordefinieren können, den Prozentsatz als Ganzzahl betrachten müssen. In diesem Fall würden 25,5% eine Genauigkeit von 4 und eine Skala von 3 (nicht eine) erfordern, da wir dies als 0,255 betrachten müssen. Ich bin schon früh auf dieses Problem gestoßen und war eine Weile ratlos und habe mich gefragt, warum Skala 1 nicht funktioniert.
Ashton Sheets
1
@mezoid Was bedeutet ein negativer Skalenwert?
Geek
@Geek Laut technet.microsoft.com/en-us/library/ms187746.aspx darf die Skala nicht kleiner als Null sein. 0 <= Skala <= Genauigkeit. Im Wesentlichen wäre ein negativer Skalenwert bedeutungslos.
Mezoid
1
Sollte es nicht sein: "Die numerische Genauigkeit bezieht sich auf die maximale Anzahl von Ziffern, die in der Anzahl vorhanden sein können."? Die genaue Zahl 123,5 könnte ebenfalls die Genauigkeit 10 haben, es müssen jedoch keine weiteren Ziffern hinzugefügt werden. Oder würde dies 123.5000000 werden?
Chris311
86

Die Genauigkeit einer Zahl ist die Anzahl der Ziffern.

Die Skalierung einer Zahl ist die Anzahl der Stellen nach dem Dezimalpunkt.

Beim Festlegen der Genauigkeit und Skalierung der Felddefinition wird im Allgemeinen impliziert, dass sie Maximalwerte darstellen .

Beispiel: Ein Dezimalfeld, das mit den folgenden Werten definiert ist precision=5und scale=2diese zulässt:

  • 123.45 (p = 5, s = 2)
  • 12.34 (p = 4, s = 2)
  • 12345 (p = 5, s = 0)
  • 123.4 (p = 4, s = 1)
  • 0 (p = 0, s = 0)

Die folgenden Werte sind nicht zulässig oder würden einen Datenverlust verursachen:

  • 12.345(p = 5, s = 3) => könnte abgeschnitten werden in 12.35(p = 4, s = 2)
  • 1234.56(p = 6, s = 2) => könnte abgeschnitten werden in 1234.6(p = 5, s = 1)
  • 123.456(p = 6, s = 3) => könnte abgeschnitten werden in 123.46(p = 5, s = 2)
  • 123450 (p = 6, s = 0) => außerhalb des Bereichs

Beachten Sie, dass der Bereich im Allgemeinen durch die Genauigkeit definiert wird: |value| < 10^p...

Boumbh
quelle
5
Beachten Sie, dass MS SQL Server 12345 oder 1234.56 nicht zulässt, da "[Skala] von [Genauigkeit] abgezogen wird, um die maximale Anzahl von Stellen links vom Dezimalpunkt zu bestimmen." (Quelle: dezimal und numerisch )
Molnarm
Wie wäre es 12345000? Präzision 5 oder 8? Wenn 5, mit welcher Skala? Skala -3?
Towi
@towi was heißt das Wenn Sie das speichern möchten, würden Sie 8,0 verwenden.
Rob Grant
Schöne Antwort, aber warum ist 123450 (p=6,s=0)außerhalb der Reichweite? 123450 hat 6 Ziffern und keine Ziffern nach einem Punkt?
Matthias Burger
1
@MatthiasBurger 123450 (p=6,s=0)würde für ein Dezimalfeld mit einer Genauigkeit von 5 außerhalb des Bereichs liegen (wie im Beispiel erwähnt). Weil die Genauigkeit einer Zahl, die Sie in einem Feld speichern möchten, kleiner oder gleich der Genauigkeit des Feldes sein muss.
Snozzlebert
26

Präzision, Skalierung und Länge in der SQL Server 2000-Dokumentation lauten:

Präzision ist die Anzahl der Stellen in einer Zahl. Skalieren ist die Anzahl der Stellen rechts vom Dezimalpunkt einer Zahl. Zum Beispiel hat die Zahl 123.45 eine Genauigkeit von 5 und eine Skala von 2.

Chris
quelle
Danke dir. Ich habe gerade festgestellt, dass ein Stück Delphi / Pascal-Code eine Skala von 0 verwendet, um den Dezimalteil von float
peterchaula