Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:Dezimalgenauigkeit/-skalierung führen zu seltsamen Ergebnissen

Die Dokumentation ist ein wenig unvollständig, was die Magie des Wertes 6 betrifft und wann der max anzuwenden ist Funktion, aber hier ist eine Tabelle meiner Erkenntnisse, basierend auf dieser Dokumentation.

Wie es heißt, sind die Formeln für die Division:

Und, wie Sie selbst hervorheben, haben wir dann die Fußnote:

Also, hier ist, was ich in meiner Tabelle produziert habe:

p1 s1 p2 s2 prInit srInit prOver prAdjusted srAdjusted
38 16 38 16 93     55     55     38         6
28 16 28 16 73     45     35     38         10
29 16 29 16 75     46     37     38         9

Also verwende ich pr und sr um die Genauigkeit und den Umfang des Ergebnisses anzugeben. Die prInit und srInit Formeln sind genau die Forumlas aus der Dokumentation. Wie wir sehen können, ist die Genauigkeit des Ergebnisses in allen 3 Fällen deutlich größer als 38 und so gilt die Fußnote. prOver ist nur max(0,prInit - 38) - um wie viel wir die Genauigkeit anpassen müssen, wenn die Fußnote zutrifft. prAdjusted ist nur prInit - prOver . Wir können in allen drei Fällen sehen, dass die endgültige Genauigkeit des Ergebnisses 38 ist .

Wenn ich das selbe anwende Anpassungsfaktor an die Waage, dann würde ich Ergebnisse von 0 erhalten , 10 und 9 . Aber wir können sehen, dass Ihr Ergebnis für (38,16) Fall hat eine Skala von 6 . Ich glaube also, dass dort max(6,... Teil der Dokumentation trifft tatsächlich zu. Also meine endgültige Formel für srAdjusted ist max(6,srInit-prOver) und jetzt mein letztes Adjusted Werte scheinen mit Ihren Ergebnissen übereinzustimmen.

Und natürlich, wenn wir die Dokumentation für decimal , können wir sehen, dass die default Genauigkeit und Maßstab, wenn Sie sie nicht angeben, sind (18,0) , also hier ist die Zeile, wenn Sie Genauigkeit und Skalierung nicht angegeben haben:

p1 s1 p2 s2 prInit srInit prOver prAdjusted srAdjusted
18 0  18 0  37     19     0      37         19