Eu tenho algumas propriedades em C#
que estão double
e quero armazená-las em uma tabela no SQL Server, mas notei que não há nenhum double
tipo, portanto, o que é melhor usar decimal
oufloat
?
Isso armazenará os valores de latitude e longitude, por isso preciso da precisão mais precisa.
Obrigado pelas respostas até agora.
c#
sql
sql-server
sql-server-2005
tsql
Xaisoft
fonte
fonte
Respostas:
Ou se você quer ir à moda antiga:
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.
fonte
Além disso, aqui está uma boa resposta para o mapeamento de tipo SQL-CLR com um gráfico útil.
Daquele post (de David ):
fonte
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 -> "."
fonte
Você deve mapeá-lo para FLOAT (53) - é o que o LINQ to SQL faz .
fonte
float
no SQL Server, na verdade, tem [editar: quase] a precisão de um "duplo" (no sentido de C #).float
é sinônimo defloat(53)
. 53 são os bits da mantissa.O .NET
double
usa 54 bits para a mantissa.fonte
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.
fonte
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.
fonte
A
Float
representadouble
no servidor SQL. Você pode encontrar uma prova da codificação em C # no visual studio. Aqui eu declareiOvertime
comoFloat
no SQL Server e em C #. Assim eu sou capaz de converterAqui
OverTime
é declaradofloat type
fonte