Pergunta

Olá, eu tenho um DataRow puxado para fora de um DataTable de um DataSet. Eu estou acessando uma coluna que é definida em SQL como um tipo de dados float. Eu estou tentando atribuir esse valor a uma variável local (c # flutuante tipo de dados), mas estou recebendo um InvalidCastExecption

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];  

Agora, a brincar com isso eu fiz fazê-lo funcionar, mas não fazia qualquer sentido e que não se sentia bem.

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

Alguém pode explicar o que estou ausente aqui?

Foi útil?

Solução

A SQL float é um duplo de acordo com a a documentação para SQLDbType .

Outras dicas

Um flutuador no SQL é uma Duplo na CLR (C # / VB). Há uma tabela de tipos de dados SQL com os equivalentes CLR no MSDN.

E normalmente você nunca iria querer usar flutuador no SQL Server (ou real) se você pretende realizar cálculos matemáticos sobre os dados, pois é um tipo de dados inexatos e que irá introduzir erros de cálculo. Use um tipo de dados decimal em vez se você precisa de precisão.

O flutuador no Microsoft SQL Server é equivalente a uma dupla em C #. A razão para isto é que um número de ponto flutuante só pode aproximar um número decimal, o precisão de um número de ponto flutuante determina a precisão com que o número aproxima um número decimal. O tipo duplo representa um número de dupla precisão de 64 bits de ponto flutuante com valores que variam de negativo para positivo 1.79769313486232E308 1.79769313486232E308, bem como positivo ou negativo zero, PositiveInfinity, NegativeInfinity, e não a um número (NaN).

Acho que a principal pergunta foi respondida aqui, mas sinto-me obrigado a acrescentar algo para a seção de questão que os Estados que isso funciona.

_AccelLimit = (float) (double) exercício [ "DefaultAccelLimit"];

A razão deste "obras" e a razão pela qual "não se sente bem" é que você está rebaixando a dupla a um flutuador pelo segundo elenco (o da esquerda) para que você está perdendo precisão e dizendo eficazmente o compilador que é ok para truncar o valor devolvido.

Em palavras esta linha diz ... Obter um objeto (que passa a realizar uma dupla neste caso) Converter o objeto para um duplo (perder todo o objeto de embrulho) Lançai a dupla em um float (perdendo toda a precisão multa de um duplo)

por exemplo. Se o valor for digamos ,0124022806089461 e você fazer o descrito acima, em seguida, o valor de AccelLimit será 0.01240228

, que é a extensão do que um float em C # pode começar a partir do valor duplo. É uma coisa perigosa para fazer e eu tenho certeza que é um truncamento também em vez de um arredondamento mas alguém pode querer confirmar isso como eu não tenho certeza.

A razão pela qual "não se sente bem" é porque C # usa a mesma sintaxe para unboxing e para carcaça , que são duas coisas muito diferentes. exercise["DefaultAccelLimit"] contém um valor duplo, encaixotado como um objecto. (double) é necessário para unbox o objeto de volta para um duplo. O (float) em frente que, em seguida, moldes a dupla para um valor flutuante. faz C # não permite boxe e lançando na mesma operação, por isso você deve unbox, em seguida, lançar.

O mesmo é verdadeiro mesmo se o elenco é não destrutiva. Se uma bóia foi embalado como um objeto que você queria elenco em um casal, você faria assim:. (double)(float)object_var

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top