Verschil tussen numeriek, zwevend en decimaal in SQL Server

Wat zijn de verschillen tussen de gegevenstypen numeric, floaten decimalen welke moeten in welke situaties worden gebruikt?

Voor elke vorm van financiële transactie (bijvoorbeeld voor het salarisveld), welke heeft de voorkeur en waarom?


Antwoord 1, autoriteit 100%

gebruik de floatof realgegevenstypes alleen alsde precisie die wordt gegeven door decimaal(maximaal 38 cijfers ) is onvoldoende

  • Geschatte numerieke gegevenstypen slaan niet de exacte waarden op die voor veelgetallen zijn opgegeven; ze slaan een extreem nauwkeurigebenadering van de waarde op.(Technet)

  • Vermijd het gebruik van float- of real-kolommen in de zoekvoorwaarden van de WHERE-clausule, met name de = en <> operators (Technet)

dus in het algemeen omdat de precisie geleverd door decimaal[10E38 ~ 38 cijfers] is als je nummer erin past, en kleinere opslagruimte (en misschien snelheid) van Float niet belangrijk is en omgaan met abnormaal gedrag en problemen van geschatte numerieke typen zijn niet acceptabel, gebruik decimaal in het algemeen.

meer nuttige informatie

  • numeriek = decimaal (5 tot 17 bytes) (Exactnumeriek gegevenstype)
    • wordt toegewezen aan Decimaal in .NET
    • beide hebben (18, 0) als standaard (precisie,schaal) parameters in SQL server
    • schaal = maximum aantal decimale cijfers dat rechts van de komma kan worden opgeslagen.
    • houd er rekening mee dat geld (8 byte) en smallmoney (4 byte) ook exact zijn en overeenkomen met decimalen in .NET en 4 decimalen hebben (MSDN)
    • decimaal en numeriek (Transact-SQL) – MSDN
  • echt (4 bytes) (Geschattenumeriek gegevenstype)
  • float (8 byte) (Geschattenumeriek gegevenstype)
    • wordt toegewezen aan Double in .NET
  • Alle exactenumerieke typen geven altijd hetzelfde resultaat, ongeacht welk type
    van de processorarchitectuur wordt gebruikt of de grootte van de getallen
  • De parameter die aan het datatype float wordt geleverd, definieert het aantal bits dat
    gebruikt om de mantissevan het drijvende-kommagetalop te slaan.
  • Geschat numeriek gegevenstype gebruikt meestal minder opslagruimte en heeft een betere snelheid (tot 20x) en u moet ook overwegen wanneer ze zijn geconverteerd in .NET

Exacte numerieke gegevenstypen
Geschatte numerieke gegevenstypen

hoofdbron: MCTS Self Trainingspakket met tempo (examen 70-433): Microsoft® SQL Server® 2008-databaseontwikkeling– Hoofdstuk 3 – Tabellen, gegevenstypen en declaratieve gegevensintegriteit Les 1 – Gegevenstypen kiezen (richtlijnen) – Pagina 93


Antwoord 2, autoriteit 5%

Richtlijnen van MSDN: Decimaal, zwevend, en echte gegevens

De standaard maximale precisie van numerieke en decimale gegevenstypen is 38.
In Transact-SQL is numeriek functioneel equivalent aan het decimaalteken
data type. Gebruik het decimale gegevenstype om getallen met decimalen op te slaan
wanneer de gegevenswaarden precies zoals gespecificeerd moeten worden opgeslagen.

Het gedrag van float en real volgt de
IEEE 754-specificatie op geschatte numerieke gegevenstypen. Vanwege de benaderende aard van de float- en real-gegevenstypen, gebruik deze gegevenstypen niet wanneer ze exact zijn
numeriek gedrag is vereist, zoals in financiële toepassingen, in
bewerkingen met afronding of gelijkheidscontroles. Gebruik in plaats daarvan de
gegevenstypen integer, decimaal, geld of smallmoney. Vermijd het gebruik van float
of echte kolommen in zoekvoorwaarden van de WHERE-clausule, met name de =
en <> exploitanten. Het is het beste om float en echte kolommen te beperken tot > of <
vergelijkingen.


Antwoord 3, autoriteit 3%

Ze verschillen in prioriteit van gegevenstype

Decimaalen Numeriekzijn functioneelhetzelfde, maar er is nog steeds voorrang van gegevenstype, wat cruciaal kan zijn in sommige gevallen.

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

Het resulterende gegevenstype is numeriekomdat het voorrang heeft op het gegevenstype.

Uitgebreide lijst van gegevenstypen op prioriteit:

Referentielink


Antwoord 4, autoriteit 2%

Geen volledig antwoord, maar een nuttige link:

“Ik voer vaak berekeningen uit met decimale waarden. In sommige gevallen geeft het zo snel mogelijk zweven van decimale waarden, voorafgaand aan berekeningen, een betere nauwkeurigheid. “

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


Antwoord 5

Decimaal heeft een vaste precisie, terwijl float een variabele precisie heeft.

BEWERKEN (kon de hele vraag niet lezen):
Float(53) (ook bekend als echt) is een getal met dubbele precisie (64-bits) met drijvende komma in SQL Server. Regular Float is een getal met enkele precisie (32-bits) met drijvende komma. Dubbel is een goede combinatie van precisie en eenvoud voor veel berekeningen. U kunt een getal met zeer hoge precisie maken met decimaal — tot 136-bit — maar u moet er ook voor zorgen dat u uw precisie en schaal correct definieert, zodat het al uw tussentijdse berekeningen tot het benodigde aantal cijfers kan bevatten.


Antwoord 6

Floatis een gegevenstype bij benadering, wat betekent dat niet alle waarden in het gegevenstypebereik exact kunnen worden weergegeven.

Decimaal/Numeriekis een gegevenstype met vaste precisie, wat betekent dat alle waarden in het gegevenstypebereik exact met precisie en schaal kunnen worden weergegeven. U kunt decimalen gebruiken om geld te besparen.

Het converteren van decimaal of numeriek naar zwevend kan enig verlies van precisie veroorzaken. Voor de gegevenstypen Decimaal of Numeriek beschouwt SQL Server elke specifieke combinatie van precisie en schaal als een ander gegevenstype. DECIMAL(2,2) en DECIMAL(2,4) zijn verschillende gegevenstypen. Dit betekent dat 11.22 en 11.2222 verschillende typen zijn, hoewel dit niet het geval is voor float. Voor FLOAT(6) zijn 11.22 en 11.2222 dezelfde datatypes.

U kunt ook het gegevenstype geldgebruiken om geld te besparen. Dit is een native gegevenstype met een precisie van 4 cijfers voor geld. De meeste experts geven de voorkeur aan dit gegevenstype om geld te besparen.

Referentie
1
2
3


Antwoord 7

De zaak voor Decimaal

Wat is de onderliggende behoefte?

Het komt voort uit het feit dat computers uiteindelijk, intern, getallen in binair formaat vertegenwoordigen. Dat leidt onvermijdelijk tot afrondingsfouten.

Overweeg dit:

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

De bovenstaande ellips […] betekent ‘oneindig’. Als je er goed naar kijkt, is er een oneindig herhalend patroon (=’0011′)

Dus op een gegeven moment moet de computer die waarde afronden. Dit leidt tot accumulatiefouten die het gevolg zijn van het herhaaldelijk gebruik van getallen die onjuist zijn opgeslagen.

Stel dat u financiële bedragen wilt opslaan (dit zijn getallen die een breuk kunnen hebben). Allereerst kun je natuurlijk geen gehele getallen gebruiken (gehele getallen hebben geen fractioneel deel).
Vanuit puur wiskundig oogpunt zou de natuurlijke neiging zijn om een floatte gebruiken. Maar in een computer hebben drijvers het deel van een getal dat achter een decimaalteken staat – de “mantisse” – beperkt. Dat leidt tot afrondingsfouten.

Om dit te verhelpen, bieden computers specifieke datatypes die de binaire afrondingsfout in computers voor decimale getallen beperken. Dit zijn het gegevenstype dat:
moet absoluut worden gebruikt om financiële bedragen weer te geven. Deze gegevenstypen worden meestal decimalgenoemd. Dat is bijvoorbeeld het geval in C#. Of, decimalin de meeste databases.


Antwoord 8

Hoewel de vraag niet het gegevenstype MONEY bevatte, zouden sommige mensen die deze thread tegenkomen, in de verleiding kunnen komen om het gegevenstype MONEY te gebruiken voor financiële berekeningen.

Pas op voor het gegevenstype MONEY, de nauwkeurigheid is beperkt.

Er staat veel goede informatie over in de antwoorden op deze Stackoverflow-vraag:

Moet u het GELD kiezen of DECIMAL(x,y) datatypes in SQL Server?

Other episodes