Pergunta

Eu estou tendo algum problema estranho aqui. Eu tenho uma tabela de banco de dados que tem um enorme valor armazenado em uma coluna. Meu aplicativo (C #) está a ler este valor e mantendo em um duplo tipo. Esta aplicação irá inserir o mesmo valor para outra mesa. Nota: Eu não estou fazendo todos os cálculos / processamento sobre o valor lido a partir da primeira tabela. É só ficava para atualizar a segunda tabela.

questão aqui é, a segunda tabela está recebendo o valor ligeiramente diferente do que na primeira tabela. Parece que o número é arredondamento quando eu manter no tipo double.

Aqui está um exemplo de valores.

Valor Original: 18014398509481984

Valor copiados para nova tabela: 18014398509482000

Os valores parece diferente, mas ambos são iguais em realidade. Eu fiz uma pesquisa no Google com 18014398509481984 - 18014398509482000 como um termo de pesquisa e retornou resultado 0 , que significa tanto são os mesmos.

Perguntas :

1 - Se ambos são iguais, por que o segundo valor parece diferente? Eu posso ver 1984 se transformou em 2000 .

2 - Por que acontece a conversão

3 -? Como posso evitar este tipo de conversões

Qualquer ajuda seria ótimo!

Foi útil?

Solução

Tente usar um System.Decimal para armazenar o valor da primeira tabela, em vez de um System.Double. System.Double não parece conter dígitos significativos o suficiente para armazenar tão grande de um valor com precisão.

Outras dicas

Um valor de precisão dupla é preciso apenas para 15 ou 16 dígitos decimais (ver aqui para uma explicação). Se você precisa armazenar mais do que isso, então você terá que usar um formato de número diferente. Se você quiser trabalhar com muito grandes inteiros, sem perder precisão, então existem várias classes lá fora, para ajudá-lo como este .

Se você está recebendo um valor de SQL, certifique-se de que o seu tipo de dados de destino no .NET corresponde - bigint SQL para C # muito tempo, por exemplo -. Para evitar arredondamento questões como esta

Eu acredito que isso é devido ao flutuante precisão de ponto (o grande número usará uma mantissa expoente), o que significa que seria, essencialmente, ser representado como um número entre facções com um poder. números fracionários no entanto encontrar erros de arredondamento devido a aritmética de ponto flutuante.

Normalmente a maneira redonda isso é para evitar valores pontuais (tentar Int64), use um tipo mais preciso (Decimal) ou conta para o erro e fazer um 'aprox igual a'. Flutuante

Você precisa armazenar estes como números de ponto flutuante?

Se não, então você poderia usar inteiros de 64 bits em vez disso: BIGINT no banco de dados, e long / Int64 em seu aplicativo.

Estes têm uma gama de -9.223.372.036.854.775.808 até 9.223.372.036.854.775.807 e sem problemas de precisão / precisão.

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