SQL server 2005 numerische Präzision Verlust
Debuggen einige Finanz-bezogene SQL-code gefunden, der ein seltsames Problem mit numerischen(24,8) Mathematik Präzision.
Ausführen der folgenden Abfrage auf Ihre MSSQL, Sie würden Holen Sie sich A + B * C-Ausdruck Ergebnis 0.123457
WÄHLEN SIE EIN,
B,
C,
A + B * C
AUS
(
SELECT CAST(0.12345678 ALS NUMERIC(24,8)) ALS,
CAST(0 AS NUMERIC(24,8)) WIE B,
CAST(500, DIE ALS NUMERISCHE(24,8)) ALS C
) T
So dass wir verloren haben 2 bedeutende Symbole. Versuchen, um dieses Problem in unterschiedlicher Weise bekam ich, dass die Umstellung von der Mittelstufe Multiplikation Ergebnis (die Null!) numeric (24,8) würde funktionieren.
Und schließlich eine Lösung habe. Aber ich hace eine Frage - warum MSSQL so verhält und welche Umbauten tatsächlich bewahrheitet in meinem Beispiel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur als Ergänzung zu den Typ float ist ungenau, Multiplikation mit der Dezimalzahl-Typen können ungenau sein (oder zu Ungenauigkeiten) wenn Sie mehr als die Präzision. Sehen Datentyp-Konvertierung und decimal und numeric.
Da Sie multipliziert
NUMERIC(24,8)
undNUMERIC(24,8)
- und SQL-Server überprüft nur den Typ, nicht auf den Inhalt, wird es wahrscheinlich versuchen Sie das Potenzial 16 nicht-dezimalen Ziffern (24 - 8), wenn Sie können nicht speichern Sie alle 48 Ziffern der Präzision (max 38). Kombinieren Sie zwei von Ihnen, Sie 32 nicht-dezimalen Ziffern, die Sie verlässt mit nur 6 Dezimalstellen (38 - 32).Somit die ursprüngliche Abfrage
reduziert sich auf
Wieder, zwischen
NUMERIC(24,8)
undNUMERIC(38,6)
SQL Server zu speichern versuchen, das Potenzial 32 Ziffern von nicht-dezimalen, soA + D
reduziert sich aufgibt Sie
0.123457
nach der Rundung.NUMERIC(p, s)
,p
steht für Präzision die Summe die Anzahl der Ziffern. So inNUMERIC(24, 8)
gibt es 16 Ziffern von nicht-Dezimalzahlen. Keine bits. Wieder, Lesen Sie sich bitte den link in der msdn-Dokumentation.Nach der Logik hingewiesen hat, eed3si9n und das, was Sie gesagt in Ihrer Frage, es scheint, dass der beste Ansatz, wenn dabei die Mathematik-Operationen zu extrahieren und Sie in eine Funktion und zusätzlich die Genauigkeit festlegen nach jeder operation,
Es in diesem Fall die Funktion könnte so Aussehen:
Trotz allem, was es sagt, auf Genauigkeit, Dezimalstellen und Länge (Transact-SQL). Ich glaube, es ist auch die Anwendung mindestens 'scale (Anzahl Nachkommastellen) von 6, um die daraus resultierenden NUMERISCHEN Typs, die für die Multiplikation das gleiche wie für division etc.