Cosa rappresenta un doppio in SQL Server?


335

Ho un paio di proprietà in C#cui sono doublee voglio archiviarle in una tabella in SQL Server, ma ho notato che non esiste alcun doubletipo, quindi qual è il migliore da usare, decimalo float?

Questo memorizzerà i valori di latitudine e longitudine, quindi ho bisogno della precisione più accurata.

Grazie per le risposte finora.


Ecco i mapping dei tipi di dati CLR su SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achille

Esiste un ottimo thread su MSDN che descrive la differenza principale tra FLOAT e DECIMAL. In breve, Float è approssimativo e non può rappresentare alcuni valori. Guarda la risposta accettata.
Matthew Jones,

Risposte:


387
float

O se vuoi andare alla vecchia scuola:

real

Puoi anche usare float (53), ma significa la stessa cosa di float.

("reale" equivale a float (24), non float / float (53).)

Il tipo decimale (x, y) di SQL Server è indicato per i numeri decimali esatti anziché in virgola mobile (che possono essere approssimazioni). Ciò è in contrasto con il tipo di dati "decimale" C #, che è più simile a un numero in virgola mobile a 128 bit.

Il tipo float di MSSQL è equivalente al doppio tipo a 64 bit in .NET. (La mia risposta originale del 2011 ha detto che potrebbe esserci una leggera differenza nella mantissa, ma l'ho provato nel 2020 e sembrano essere compatibili al 100% nella loro rappresentazione binaria di numeri molto piccoli e molto grandi - vedi https: / /dotnetfiddle.net/wLX5Ox per il mio test).

Per rendere le cose più confuse, un "float" in C # è solo a 32 bit, quindi sarebbe più equivalente in SQL al tipo real / float (24) in MSSQL rispetto a float / float (53).

Nel tuo caso d'uso specifico ... Tutto ciò di cui hai bisogno è 5 punti dopo il punto decimale per rappresentare la latitudine e la longitudine entro una precisione di circa un metro e per i gradi sono necessarie solo fino a tre cifre prima del punto decimale. Float (24) o decimale (8,5) si adatteranno al meglio alle tue esigenze in MSSQL e l'utilizzo di float in C # è abbastanza buono, non è necessario il doppio. In effetti, i tuoi utenti probabilmente ti ringrazieranno per arrotondare al 5 ° decimale invece di avere un mucchio di cifre insignificanti che arrivano per la corsa.


1
Dici float, David dice decimale, ora sono ancora più confuso :)
Xaisoft,

Sto usando i doppi in c # e questi valori saranno i valori di latitudine e longitudine nelle rispettive colonne.
Xaisoft,

1
Devo concordare e ammettere che ero fuori base. Mi è stato introdotto il decimale nel mondo IBM DB2, dove il decimale è un tipo di dati reale, supportato da tutti i tipi di codice e dal database su piattaforme IBM. Non che non sia un vero tipo di dati nel mondo della SM, ma non è supportato come nel campo IBM. Ci scusiamo per aver creato confusione.
DaveN59,

2
"Il float MSSQL non ha esattamente la stessa precisione del doppio tipo a 64 bit in .NET (leggera differenza nella mantissa IIRC), ma è una corrispondenza abbastanza vicina alla maggior parte degli usi." Hai un riferimento per questo? Per quanto posso vedere, entrambi usano 53 bit di significato, usano 64 bit per l'archiviazione e hanno lo stesso layout di bit e significato di IEEE 754.
codekaizen

2
Sono anche abbastanza curioso della domanda sollevata da @codekaizen (leggera differenza nella mantissa). Hai un riferimento o un test che esemplifica questo?
Mads Ravn,


15

float è l'equivalente più vicino.

Enumerazione SqlDbType

Per Lat / Long come indicato nell'OP.

Un metro è 1/40.000.000 di latitudine, 1 secondo è circa 30 metri. Float / double ti danno 15 cifre significative. Con un po 'di aritmetica mentale rapida e complicata ... gli errori di arrotondamento / approssimazione sarebbero circa la lunghezza di questo stop di riempimento -> "."


1
Vendi la tua tecnologia dello schermo ad Apple e guadagna miliardi! (L'aritmetica rapida mi dice che hai la risoluzione più estrema di cui abbia mai sentito parlare, anche a latitudini vicine al Polo Nord / Sud; circa un miliardo di volte più alte delle mie.)
Jonas Byström


8

float in SQL Server effettivamente [modifica: quasi] la precisione di un "doppio" (in senso C #).

floatè sinonimo di float(53). 53 sono i pezzi della mantissa.

.NET doubleutilizza 54 bit per la mantissa.


2
In realtà, IIRC, double in .NET utilizza una mantissa a 52 bit e un esponente a 11 bit.
richardtallent,

Sarò dannatamente; hai ragione! Mi chiedo cosa fa SQL con il bit extra; non è usato per l'esponente. In tal caso, l'esponente salirà a + -616 invece di + -308. Forse per rintracciare NULL?
Euro Micelli,

Ora sono confuso. Ogni prova indica l'idea che usano lo stesso formato (come tutto il resto in Windows). E perché non dovrebbero? Non riesco a trovare un'affermazione definita sulla rappresentazione bit a bit in SQL Server (oltre alla pagina di aiuto per float). Pubblicherò una correzione se lo scoprissi.
Euro Micelli,

5

Per SQL Sever:

Il tipo decimale è un numero con segno a 128 bit Float è un numero con segno a 64 bit.

La vera risposta è Float , non ero corretto sul decimale.

Il motivo è che se usi un decimale non riempirai mai 64 bit del tipo decimale.

Sebbene il decimale non ti dia un errore se provi a usare un tipo int.

Ecco una bella tabella di riferimento dei tipi.


Ora è ancora più confuso con due risposte diverse: p
Xaisoft,

1
Non essere confuso. Questa risposta è sbagliata Il decimale è un tipo base 10; Float (in SQL Server e CLR) è un tipo base-2.
Michael Petrotta,

3

Sembra che tu possa scegliere. Se scegli il galleggiante, potresti perdere 11 cifre di precisione. Se questo è accettabile, provaci - a quanto pare i progettisti di Linq hanno pensato che questo fosse un buon compromesso.

Tuttavia, se l'applicazione ha bisogno di quelle cifre extra, usa il decimale. Il decimale (implementato correttamente) è comunque molto più preciso di un float - nessuna traduzione disordinata dalla base 10 alla base 2 e ritorno.


Questo serve per memorizzare i valori di latitudine e longitudine. Questo fa la differenza?
Xaisoft,

Questo è solo sbagliato ... sia float / float (53) in MSSQL che double in C # hanno circa 15 cifre di precisione. Non sono esattamente gli stessi, ma abbastanza vicini. Il decimale, d'altra parte, è un overkill completo per l'archiviazione di un doppio e deve tornare alla base 2 per tutti i calcoli in SQL Server e tornare a C # come doppio.
richardtallent,

Sono corretto. Quello che stai dicendo ha perfettamente senso per me. Il decimale ha senso solo se lo si mantiene ovunque come valore decimale. Perdi valore ogni volta che esegui una conversione dalla base 10 alla base 2 (e ritorno).
DaveN59,

-2

A Floatrappresenta doublenel server SQL. Puoi trovare una prova dalla codifica in C # in Visual Studio. Qui ho dichiarato Overtimecome in un Floatserver SQL e in C #. Quindi sono in grado di convertire

int diff=4;
attendance.OverTime = Convert.ToDouble(diff);

Qui OverTimeè dichiaratofloat type

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.