Was sind die Unterschiede zwischen numeric
, float
und decimal
Datentypen und die in welchen Situationen verwendet werden soll?
Welche Art von Finanztransaktion (z. B. für Gehaltsbereiche) wird bevorzugt und warum?
Was sind die Unterschiede zwischen numeric
, float
und decimal
Datentypen und die in welchen Situationen verwendet werden soll?
Welche Art von Finanztransaktion (z. B. für Gehaltsbereiche) wird bevorzugt und warum?
Antworten:
Verwenden Sie den Float- oder Real -Datentyp nur, wenn die Genauigkeit der Dezimalzahl (bis zu 38 Stellen) nicht ausreicht
Ungefähre numerische Datentypen speichern nicht die genauen Werte, die für viele Zahlen angegeben wurden. Sie speichern eine extrem enge Annäherung an den Wert. ( Technet )
Vermeiden Sie die Verwendung von Float- oder Real-Spalten in den Suchbedingungen der WHERE-Klausel, insbesondere der Operatoren = und <> ( Technet ).
Daher ist die Genauigkeit der Dezimalzahl im Allgemeinen [10E38 ~ 38 Stellen], wenn Ihre Zahl hineinpasst, und der kleinere Speicherplatz (und möglicherweise die Geschwindigkeit) von Float ist nicht wichtig, und der Umgang mit abnormalen Verhaltensweisen und Problemen mit ungefähren numerischen Typen ist dies nicht akzeptabel, verwenden Sie Dezimal im Allgemeinen .
weitere nützliche Informationen
Hauptquelle : MCTS Self-Paced Training Kit (Prüfung 70-433): Microsoft® SQL Server® 2008-Datenbankentwicklung - Kapitel 3 - Tabellen, Datentypen und deklarative Datenintegrität Lektion 1 - Auswählen von Datentypen (Richtlinien) - Seite 93
use the float or real data types only if the precision provided by decimal is insufficient
- Ich dachte, real ist WENIGER genau als dezimal. Wie kommt es, dass Sie schreiben, um real zu verwenden, wenn die Dezimalzahl nicht ausreicht?
decimal
dies in Ordnung. Das ist eine Genauigkeit von 20. Wenn Sie Werte zwischen beispielsweise 1e20 und 1e-20 speichern müssen, decimal
können Sie das nicht . Das sind 40 Stellen Genauigkeit. Sie können 1e20 und 1e-20 niemals im selben decimal
Feld speichern . Stattdessen können Sie verwenden float
, das intern alles als Protokoll der Basis 2 speichert. Dies ermöglicht den vollen Genauigkeitsbereich in einem Feld mit dem Nachteil, dass nur die ersten ~ 8 Ziffern genau sind.
float
..." - sagte wer? Ist das ein Zitat oder deine Meinung?
Richtlinien von MSDN: Verwenden von Dezimal-, Gleitkomma- und Realdaten
Die maximale Standardgenauigkeit von numerischen und dezimalen Datentypen beträgt 38. In Transact-SQL entspricht numerisch dem dezimalen Datentyp. Verwenden Sie den Dezimaldatentyp, um Zahlen mit Dezimalstellen zu speichern, wenn die Datenwerte genau wie angegeben gespeichert werden müssen.
Das Verhalten von float und real folgt der IEEE 754-Spezifikation für ungefähre numerische Datentypen. Verwenden Sie diese Datentypen aufgrund der ungefähren Natur des Float- und des Real-Datentyps nicht, wenn ein genaues numerisches Verhalten erforderlich ist, z. B. bei Finanzanwendungen, bei Operationen mit Rundung oder bei Gleichheitsprüfungen. Verwenden Sie stattdessen die Datentypen Integer, Decimal, Money oder Smallmoney. Vermeiden Sie die Verwendung von Float- oder Real-Spalten in den Suchbedingungen der WHERE-Klausel, insbesondere der Operatoren = und <>. Es ist am besten, Float- und Real-Spalten auf> oder <Vergleiche zu beschränken.
Scale
Spalte angegeben.
numeric
da es niemals präziser gespeichert wird, als Sie es gewünscht haben
Keine vollständige Antwort, aber ein nützlicher Link:
"Ich berechne häufig anhand von Dezimalwerten. In einigen Fällen führt das Umsetzen von Dezimalwerten auf Float so schnell wie möglich vor Berechnungen zu einer besseren Genauigkeit."
decimal
und float
sind unterschiedlich . Die Dezimalstelle schützt so weit wie möglich vor Unterlauf, indem die Genauigkeit oder Skalierung erhöht wird. Sobald Sie jedoch die Grenze für signifikante Dezimalstellen erreicht haben, sind die Unterläufe stumm (und die Genauigkeit geht verloren). Float hat einen größeren Skalierungsbereich und die Skalierungsbeschränkungen sind tatsächlich die Ursache für den Unterlauf. Somit kann der Schwimmer eine bessere Skalierung haben. Trotzdem ist es immer noch ein ungenauer Typ.
Dezimal und Numerisch sind funktional gleich , es gibt jedoch immer noch Vorrang vor Datentypen , was in einigen Fällen von entscheidender Bedeutung sein kann.
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
Der resultierende Datentyp ist numerisch, da er Vorrang vor dem Datentyp hat .
Vollständige Liste der Datentypen nach Priorität:
Dezimal hat eine feste Genauigkeit, während float eine variable Genauigkeit hat.
BEARBEITEN (die gesamte Frage konnte nicht gelesen werden): Float (53) (auch bekannt als real) ist eine Gleitkommazahl mit doppelter Genauigkeit (32 Bit) in SQL Server. Regular Float ist eine Gleitkommazahl mit einfacher Genauigkeit. Double ist eine gute Kombination aus Präzision und Einfachheit für viele Berechnungen. Sie können eine Zahl mit sehr hoher Genauigkeit mit Dezimalzahl erstellen - bis zu 136 Bit -, aber Sie müssen auch darauf achten, dass Sie Ihre Genauigkeit und Skalierung korrekt definieren, damit sie alle Ihre Zwischenberechnungen auf die erforderliche Anzahl von Stellen enthalten kann.
Float ist ein Datentyp mit ungefährer Anzahl. Dies bedeutet, dass nicht alle Werte im Datentypbereich genau dargestellt werden können.
Dezimal / Numerisch ist ein Datentyp mit fester Präzision. Dies bedeutet, dass alle Werte im Datentypbereich exakt und präzise dargestellt werden können. Sie können Dezimalstellen verwenden, um Geld zu sparen.
Das Konvertieren von Dezimal oder Numerisch in Float kann zu Genauigkeitsverlusten führen. Für die Datentypen Dezimal oder Numerisch betrachtet SQL Server jede bestimmte Kombination aus Genauigkeit und Skalierung als einen anderen Datentyp. DECIMAL (2,2) und DECIMAL (2,4) sind unterschiedliche Datentypen. Dies bedeutet, dass 11.22 und 11.2222 unterschiedliche Typen sind, obwohl dies bei float nicht der Fall ist. Für FLOAT (6) sind 11.22 und 11.2222 dieselben Datentypen.
Sie können auch den Gelddatentyp verwenden, um Geld zu sparen. Dies ist ein nativer Datentyp mit 4-stelliger Genauigkeit für Geld. Die meisten Experten bevorzugen diesen Datentyp, um Geld zu sparen.
Was ist das zugrunde liegende Bedürfnis?
Es ergibt sich aus der Tatsache, dass Computer letztendlich intern Zahlen im Binärformat darstellen. Das führt zwangsläufig zu Rundungsfehlern.
Bedenken Sie:
0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")
Die obige Ellipse [...] bedeutet "unendlich". Wenn Sie es sich genau ansehen, gibt es ein sich unendlich wiederholendes Muster (= '0011').
Irgendwann muss der Computer diesen Wert also runden. Dies führt zu Akkumulationsfehlern, die sich aus der wiederholten Verwendung von Zahlen ergeben, die ungenau gespeichert sind.
Angenommen, Sie möchten finanzielle Beträge speichern (Zahlen, die möglicherweise einen Bruchteil ausmachen). Erstens können Sie offensichtlich keine ganzen Zahlen verwenden (ganze Zahlen haben keinen Bruchteil). Aus rein mathematischer Sicht wäre die natürliche Tendenz, a zu verwendenfloat
. In einem Computer haben Floats jedoch den Teil einer Zahl, der nach einem Dezimalpunkt liegt - die "Mantisse" - begrenzt. Das führt zu Rundungsfehlern.
Um dies zu überwinden, bieten Computer bestimmte Datentypen an, die den binären Rundungsfehler in Computern für Dezimalzahlen begrenzen. Dies ist der Datentyp, der unbedingt zur Darstellung von Finanzbeträgen verwendet werden sollte. Diese Datentypen tragen normalerweise den Namen Decimal
. Dies ist beispielsweise in C # der Fall. Oder DECIMAL
in den meisten Datenbanken.
Obwohl die Frage nicht den MONEY-Datentyp enthielt, könnten einige Personen, die auf diesen Thread stoßen, versucht sein, den MONEY-Datentyp für Finanzberechnungen zu verwenden.
Seien Sie vorsichtig mit dem Datentyp MONEY, der nur eine begrenzte Genauigkeit aufweist.
Die Antworten auf diese Stackoverflow-Frage enthalten viele gute Informationen dazu:
Sollten Sie die Datentypen MONEY oder DECIMAL (x, y) in SQL Server auswählen?