O que representa um dobro no servidor sql?

335

Eu tenho algumas propriedades em C#que estão doublee quero armazená-las em uma tabela no SQL Server, mas notei que não há nenhum doubletipo, portanto, o que é melhor usar decimaloufloat ?

Isso armazenará os valores de latitude e longitude, por isso preciso da precisão mais precisa.

Obrigado pelas respostas até agora.

Xaisoft
fonte
Aqui estão os mapeamentos CLR tipo de dados para o SQL Server: http://msdn.microsoft.com/en-us/library/system.data.sqldbtype.aspx
Achilles
Há um ótimo tópico no MSDN que descreve a principal diferença entre FLOAT e DECIMAL. Em resumo, Float é aproximado e não pode representar alguns valores. Veja a resposta aceita.
Matthew Jones

Respostas:

387
float

Ou se você quer ir à moda antiga:

real

Você também pode usar float (53), mas isso significa o mesmo que float.

("real" é equivalente a float (24), não float / float (53).)

O tipo decimal (x, y) do SQL Server é para quando você deseja números decimais exatos em vez de ponto flutuante (que podem ser aproximações). Isso contrasta com o tipo de dados "decimal" do C #, que é mais parecido com um número de ponto flutuante de 128 bits.

O tipo de flutuação do MSSQL é equivalente ao tipo duplo de 64 bits no .NET. (Minha resposta original de 2011 disse que poderia haver uma pequena diferença na mantissa, mas testei isso em 2020 e elas parecem ser 100% compatíveis na representação binária de números muito pequenos e muito grandes - consulte https: / /dotnetfiddle.net/wLX5Ox para o meu teste).

Para tornar as coisas mais confusas, um "float" em C # tem apenas 32 bits, portanto seria mais equivalente no SQL ao tipo real / float (24) no MSSQL do que float / float (53).

No seu caso de uso específico ... Tudo o que você precisa é de 5 casas após o ponto decimal para representar a latitude e longitude com precisão de cerca de um metro, e você só precisa de três dígitos antes do ponto decimal para os graus. Float (24) ou decimal (8,5) melhor atenderá às suas necessidades no MSSQL, e o uso de float em C # é bom o suficiente, você não precisa dobrar. De fato, seus usuários provavelmente agradecerão por arredondar para cinco casas decimais, em vez de ter vários dígitos insignificantes aparecendo no passeio.

richardtallent
fonte
11
Você diz "flutuar", David diz decimal, agora estou ainda mais confuso :) #
218
Estou usando dobras em c # e esses valores serão valores de latitude e longitude em suas respectivas colunas.
Xaisoft 30/07/2009
11
Eu tenho que concordar e admitir que estava fora da base. Fui apresentado ao decimal no mundo IBM DB2, onde decimal é um tipo de dados real, suportado por todos os tipos de código e banco de dados nas plataformas IBM. Não que não seja um tipo de dados real no mundo da MS, mas não é suportado nem no campo da IBM. Desculpe por criar qualquer confusão.
31410 DaveN59
2
"O float MSSQL não tem exatamente a mesma precisão que o tipo duplo de 64 bits no .NET (pequena diferença no mantissa IIRC), mas é uma correspondência suficientemente próxima da maioria dos usos." Você tem uma referência para isso? Tanto quanto eu posso ver, tanto para uso 53 bits de significand, use 64 bits para armazenamento, e têm o mesmo layout bit e significado como IEEE 754.
codekaizen
2
Também estou bastante curioso sobre a questão levantada pelo @codekaizen (pequena diferença de mantissa). Você tem uma referência ou um teste que exemplifique isso?
Mads Ravn
62

Além disso, aqui está uma boa resposta para o mapeamento de tipo SQL-CLR com um gráfico útil.

Daquele post (de David ): insira a descrição da imagem aqui

Mazdak Shojaie
fonte
Abaixo link também de uso; possui informações adicionais às anteriores, pois mostra os procedimentos e enumerações SqlDataReader (além das comparações de tipos .NET e SQL) docs.microsoft.com/en-us/dotnet/framework/data/adonet/…
d219
15

float é o equivalente mais próximo.

Enumeração SqlDbType

Para Lat / Long como OP mencionado.

Um metro mede 1 / 40.000.000 de latitude, 1 segundo mede cerca de 30 metros. Flutuar / dobrar fornece 15 números significativos. Com alguma aritmética mental rápida e desonesta ... os erros de arredondamento / aproximação seriam aproximadamente o comprimento dessa parada de preenchimento -> "."

gbn
fonte
11
Venda sua tecnologia de tela para a Apple e ganhe bilhões! (Aritmética rápida me diz que você tem a resolução mais extrema que eu já ouvi de, mesmo em latitudes próximas ao Pólo Norte / Sul, cerca de um bilhão de vezes maior que a minha.)
Jonas Byström
10

Você deve mapeá-lo para FLOAT (53) - é o que o LINQ to SQL faz .

RichardOD
fonte
8

float no SQL Server, na verdade, tem [editar: quase] a precisão de um "duplo" (no sentido de C #).

float é sinônimo de float(53) . 53 são os bits da mantissa.

O .NET doubleusa 54 bits para a mantissa.

Euro Micelli
fonte
2
Na verdade, o IIRC, duplo no .NET, usa uma mantissa de 52 bits e um expoente de 11 bits.
Richardtallent 30/07/2009
Eu serei maldito; você está certo! Eu me pergunto o que o SQL faz com o bit extra; não é usado para o expoente. Se isso acontecer, o expoente aumentará para + -616 em vez de + -308. Talvez para rastrear NULL?
Euro Micelli 30/07/2009
Agora estou confuso. Cada evidência aponta para a ideia de que eles usam o mesmo formato (como tudo o resto no Windows). E por que não? Não consigo encontrar uma declaração definitiva na representação bit a bit no SQL Server (além da página de ajuda do float). Vou postar uma correção se descobrir.
Euro Micelli
5

Para SQL Sever:

Tipo decimal é um número assinado de 128 bits. Float é um número assinado de 64 bits.

A resposta real é Float , eu estava incorreto sobre decimal.

O motivo é que, se você usar um decimal, nunca preencherá 64 bits do tipo decimal.

Embora decimal não dê erro, se você tentar usar um tipo int.

Aqui está um bom gráfico de referência dos tipos.

David Basarab
fonte
Agora é ainda mais confusa com duas respostas diferentes: p
Xaisoft
11
Não fique confuso. Esta resposta está errada. Decimal é um tipo de base 10; Flutuar (no SQL Server e no CLR) é do tipo base 2.
22430 Michael Petrotta
3

Parece que você pode escolher. Se você escolher flutuar, poderá perder 11 dígitos de precisão. Se isso for aceitável, vá em frente - aparentemente os designers do Linq acharam que essa era uma boa desvantagem.

No entanto, se seu aplicativo precisar desses dígitos extras, use decimal. Decimal (implementado corretamente) é muito mais preciso do que um float de qualquer maneira - nenhuma tradução confusa da base 10 para a base 2 e vice-versa.

DaveN59
fonte
Isso é para armazenar valores de latitude e longitude. Isso faz diferença?
Xaisoft 30/07/2009
Isso está errado ... ambos float / float (53) no MSSQL e o dobro no C # têm aproximadamente 15 dígitos de precisão. Eles não são exatamente iguais, mas próximos o suficiente. O decimal, por outro lado, é um exagero total para armazenar um dobro e precisa voltar à base 2 para todos os cálculos no SQL Server e retornar ao C # como um dobro.
Richardtallent
Eu estou corrigido. O que você está dizendo faz todo sentido para mim. Decimal só faz sentido se você o mantiver como valor decimal em qualquer lugar. Você perde valor sempre que faz uma conversão da base 10 para a base 2 (e vice-versa).
31410 DaveN59
-2

A Floatrepresenta doubleno servidor SQL. Você pode encontrar uma prova da codificação em C # no visual studio. Aqui eu declarei Overtimecomo Floatno SQL Server e em C #. Assim eu sou capaz de converter

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

Aqui OverTimeé declaradofloat type

Md Shoriful Islam
fonte