it-swarm.com.de

Unterschied zwischen numerisch, float und dezimal in SQL Server

Ich habe in Google gesucht und auch decimal and numeric und SQL Server Helper besucht, um den Unterschied zwischen numerischen, float- und decimal-Datentypen zu ermitteln und herauszufinden, in welchen Datentypen sie verwendet werden sollten welche situation.

Welche Art von Finanztransaktion (z. B. für das Gehaltsfeld) wird bevorzugt und warum?

291
priyanka.sarkar

verwenden Sie die Datentypen float oder real nur wenn die Genauigkeit von Dezimal (bis zu 38 Stellen) ist nicht ausreichend

  • Ungefähre numerische Datentypen speichern nicht die genauen angegebenen Werte für viele Zahlen; sie speichern eine extrem enge Annäherung an den Wert. ( Technet )

  • Vermeiden Sie die Verwendung von float oder reellen Spalten in den WHERE-Klauselsuchbedingungen, insbesondere die Operatoren = und <> ( Technet ).

im Allgemeinen deshalb, weil die Genauigkeit, die durch Dezimal bereitgestellt wird, [10E38 ~ 38 Ziffern] ist, wenn Ihre Zahl darin passt, und der kleinere Speicherplatz (und möglicherweise die Geschwindigkeit) von Float nicht wichtig ist und Der Umgang mit abnormalen Verhaltensweisen und Problemen von ungefähren numerischen Typen ist nicht akzeptabel. im Allgemeinen Dezimal verwenden.

weitere nützliche Informationen

  • numerisch = dezimal (5 bis 17 Byte) (gena numerischer Datentyp)
    • wird auf Decimal in .NET abgebildet
    • beide haben (18, 0) als Standardparameter (Genauigkeit, Skalierung) in SQL Server
    • scale = maximale Anzahl von Dezimalstellen, die rechts vom Dezimalpunkt gespeichert werden können.
    • bitte beachten Sie, dass Money (8 Byte) und Smallmoney (4 Byte) ebenfalls exakt sind und Dezimalstellen in .NET entsprechen und 4 Dezimalstellen haben ( MSDN )
    • dezimal und numerisch (Transact-SQL) - MSDN
  • real (4 Byte) (ngefähr Numerischer Datentyp)
  • float (8 byte) (ngefähr Numerischer Datentyp)
    • wird Double in .NET zugeordnet
  • Alle genauen numerischen Typen liefern immer das gleiche Ergebnis, unabhängig davon, welche Prozessorarchitektur verwendet wird oder die Größe der Zahlen
  • Der Parameter, der dem Datentyp float übergeben wird, definiert die Anzahl der Bits, die zum Speichern der Mantisse der Gleitkommazahl verwendet werden.
  • Der ungefähre numerische Datentyp benötigt normalerweise weniger Speicherplatz und ist schneller (bis zu 20x). Sie sollten auch berücksichtigen, wann sie in .NET Konvertiert wurden.

Exact Numeric Data TypesApproximate Numeric Data Types

Hauptquelle: MCTS Self-Paced Training Kit (Prüfung 70-433): Microsoft® SQL Server® 2008-Datenbankentwicklung - Kapitel 3 - Tabellen, Datentypen und deklarative Daten Integritätslektion 1 - Auswählen von Datentypen (Richtlinien) - Seite 93

438
Iman Abidi

Richtlinien von MSDN: Verwenden von Dezimal-, Float- und Real-Daten

Die maximale Standardgenauigkeit für numerische und dezimale Datentypen beträgt 38. In Transact-SQL entspricht numerisch funktional dem dezimalen Datentyp. Verwenden Sie den dezimalen Datentyp, 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 wegen der ungefähren Art des Floats und der reellen Datentypen nicht, wenn ein genaues numerisches Verhalten erforderlich ist, z. B. in Finanzanwendungen, bei Operationen mit Rundungen oder bei Gleichheitsprüfungen. Verwenden Sie stattdessen die Datentypen Integer, Decimal, Money oder Smallmoney. Vermeiden Sie die Verwendung von float oder reellen Spalten in den WHERE-Klauselsuchbedingungen, insbesondere in den Operatoren = und <>. Es ist am besten, float- und real-Spalten auf> oder <Vergleiche zu beschränken.

23
kmote

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 vor Berechnungen zu einer besseren Genauigkeit."

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

12
A-K

Sie unterscheiden sich in der Priorität der Datentypen

Dezimal und Numerisch sind funktional gleich , aber es gibt immer noch Vorrang vor dem Datentyp , was in einigen Fällen entscheidend sein kann.

SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')

Der resultierende Datentyp ist numerisch , da er Vorrang vor Datentypen hat .

Vollständige Liste der Datentypen nach Priorität:

Referenzlink

10
Stephan

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 sehr genaue Zahl mit einer Dezimalzahl von bis zu 136 Bit erstellen. Sie müssen jedoch auch darauf achten, dass Sie Ihre Genauigkeit und Skalierung korrekt definieren, damit alle Ihre Zwischenberechnungen bis zur erforderlichen Anzahl von Stellen darin enthalten sind.

7
Brian Reiter

Float ist ein ungefährer Datentyp. Dies bedeutet, dass nicht alle Werte im Datentypbereich exakt dargestellt werden können.

Dezimal/Numerisch ist ein Datentyp mit fester Genauigkeit. Dies bedeutet, dass alle Werte im Datentypbereich genau und skaliert dargestellt werden können. Sie können Dezimalzahlen verwenden, um Geld zu sparen.

Das Konvertieren von Decimal oder Numeric 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 Datentyp money 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.

Referenz 12

2
Somnath Muluk

Obwohl die Frage nicht den Datentyp MONEY enthielt, könnten einige Personen, die auf diesen Thread stoßen, versucht sein, den Datentyp MONEY für Finanzberechnungen zu verwenden.

Seien Sie vorsichtig mit dem Datentyp MONEY, er ist von begrenzter Genauigkeit.

In den Antworten auf diese Stackoverflow-Frage finden Sie viele gute Informationen:

Sollten Sie die Datentypen MONEY oder DECIMAL (x, y) in SQL Server auswählen?

1
Simon Tewsi

Der Fall für Decimal

Was braucht es den zugrunde liegenden?

Dies ergibt sich aus der Tatsache, dass Computer letztendlich intern Zahlen im Binärformat darstellen. Dies führt zwangsläufig zu Rundungsfehlern.

Bedenken Sie:

0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")

Die abose Ellipse [...] bedeutet "unendlich". Wenn Sie es sich genau ansehen, gibt es ein sich unendlich wiederholendes Muster (= '0011').

Irgendwann muss der Computer diesen Wert abrunden. Dies führt zu Akkumulationsfehlern durch wiederholte Verwendung ungenau gespeicherter Nummern.

Angenommen, Sie möchten Finanzbeträge speichern (Zahlen, die einen Bruchteil enthalten können). Erstens können Sie Ganzzahlen nicht offensichtlich verwenden (Ganzzahlen haben keinen Bruchteil). Rein mathematisch gesehen würde die natürliche Tendenz darin bestehen, ein float zu verwenden. 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 umgehen, bieten Computer bestimmte Datentypen an, die den Fehler der binären Rundung bei Computern für Dezimalzahlen begrenzen. Dies sind die Datentypen, die unbedingt zur Darstellung von Finanzbeträgen verwendet werden sollten. Diese Datentypen haben normalerweise den Namen Decimal. Dies ist beispielsweise in C # der Fall. Oder DECIMAL in den meisten Datenbanken.

1
Varus Septimus