Quais são as diferenças entre numeric
, float
e decimal
tipos de dados e que devem ser utilizados em que situações?
Para qualquer tipo de transação financeira (por exemplo, campo salarial), qual é a preferida e por quê?
Quais são as diferenças entre numeric
, float
e decimal
tipos de dados e que devem ser utilizados em que situações?
Para qualquer tipo de transação financeira (por exemplo, campo salarial), qual é a preferida e por quê?
Respostas:
use os tipos de dados flutuantes ou reais apenas se a precisão fornecida por decimal (até 38 dígitos) for insuficiente
Os tipos de dados numéricos aproximados não armazenam os valores exatos especificados para muitos números; eles armazenam uma aproximação extremamente próxima do valor. ( Technet )
Evite usar colunas flutuantes ou reais nas condições de pesquisa da cláusula WHERE, especialmente os operadores = e <> ( Technet )
geralmente porque a precisão fornecida pelo decimal é de [10E38 ~ 38 dígitos] se o seu número puder caber nele, e um espaço de armazenamento menor (e talvez a velocidade) do Float não é importante e lidar com comportamentos anormais e problemas de tipos numéricos aproximados não são importantes. aceitável, use decimal geralmente .
informação mais útil
fonte principal : Kit de treinamento individual do MCTS (Exame 70-433): Desenvolvimento de banco de dados Microsoft® SQL Server® 2008 - Capítulo 3 - Tabelas, tipos de dados e integridade declarativa dos dados Lição 1 - Escolhendo tipos de dados (diretrizes) - Página 93
use the float or real data types only if the precision provided by decimal is insufficient
- Eu pensei que real é MENOS exato e decimal, então como você escreve para usar real se decimal é insuficiente?
decimal
ficará bem. É uma precisão de 20. Se você precisar armazenar valores entre, digamos, 1e20 e 1e-20, bem, decimal
não pode fazer isso. São 40 dígitos de precisão. Você nunca pode armazenar 1e20 e 1e-20 no mesmo decimal
campo. Em vez disso, você pode usar float
, que armazena internamente tudo como um log da base 2. Isso permite uma gama completa de precisão em um campo com a desvantagem de que apenas os primeiros ~ 8 dígitos serão precisos.
float
..." - disse quem? É uma citação ou sua opinião?
Diretrizes do MSDN: usando dados decimais, flutuantes e reais
A precisão máxima padrão dos tipos de dados numéricos e decimais é 38. No Transact-SQL, numérico é funcionalmente equivalente ao tipo de dados decimal. Use o tipo de dados decimal para armazenar números com decimais quando os valores dos dados devem ser armazenados exatamente como especificado.
O comportamento de float e real segue a especificação IEEE 754 em tipos de dados numéricos aproximados. Devido à natureza aproximada dos tipos de dados flutuantes e reais, não use esses tipos de dados quando for necessário um comportamento numérico exato, como em aplicativos financeiros, em operações envolvendo arredondamento ou em verificações de igualdade. Em vez disso, use os tipos de dados inteiro, decimal, dinheiro ou dinheiro pequeno. Evite usar colunas flutuantes ou reais nas condições de pesquisa da cláusula WHERE, especialmente os operadores = e <>. É melhor limitar as colunas flutuantes e reais a> ou <comparações.
Scale
coluna.
numeric
pois ele nunca será armazenado com mais precisão do que o solicitado: consulte stackoverflow.com/a/759606/626804
Não é uma resposta completa, mas um link útil:
"Eu frequentemente faço cálculos com valores decimais. Em alguns casos, converter valores decimais para flutuar o mais rápido possível, antes de qualquer cálculo, produz uma precisão melhor."
decimal
e float
são diferentes . O decimal preserva contra o subfluxo, tanto quanto possível, aumentando a precisão ou a escala. No entanto, uma vez que você atinge o limite de dígitos significativos em decimal, os fluxos insuficientes são silenciosos (e a precisão é perdida). O flutuador tem uma gama maior de escalas possível e são as limitações de escala que realmente são a causa do subfluxo. Assim, o flutuador pode ter uma escala melhor. No entanto, ainda é um tipo inexato .
Decimal e Numérico são os mesmos funcionalmente, mas ainda há precedência de tipo de dados , o que pode ser crucial em alguns casos.
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
O tipo de dados resultante é numérico porque tem precedência no tipo de dados .
Lista exaustiva de tipos de dados por precedência:
Decimal tem uma precisão fixa, enquanto float tem precisão variável.
EDIT (falha ao ler a pergunta inteira): Float (53) (também conhecido como real) é um número de ponto flutuante de precisão dupla (32 bits) no SQL Server. Flutuação regular é um número de ponto flutuante de precisão única. Double é uma boa combinação de precisão e simplicidade para muitos cálculos. Você pode criar um número de precisão muito alto com decimal - até 136 bits - mas também deve ter cuidado para definir sua precisão e escala corretamente, para que ele possa conter todos os seus cálculos intermediários para o número necessário de dígitos.
Flutuar é o tipo de dados de número aproximado, o que significa que nem todos os valores no intervalo de tipos de dados podem ser representados exatamente.
Decimal / Numérico é o tipo de dados de precisão fixa, o que significa que todos os valores no intervalo de tipos de dados podem ser representados exatamente com precisão e escala. Você pode usar decimal para economizar dinheiro.
Converter de decimal ou numérico em flutuante pode causar alguma perda de precisão. Para os tipos de dados decimais ou numéricos, o SQL Server considera cada combinação específica de precisão e escala como um tipo de dados diferente. DECIMAL (2,2) e DECIMAL (2,4) são diferentes tipos de dados. Isso significa que 11.22 e 11.2222 são tipos diferentes, embora esse não seja o caso para flutuar. Para FLOAT (6), 11.22 e 11.2222 são os mesmos tipos de dados.
Você também pode usar o tipo de dados monetários para economizar dinheiro. Este é um tipo de dados nativo com precisão de 4 dígitos por dinheiro. A maioria dos especialistas prefere esse tipo de dados para economizar dinheiro.
Qual é a necessidade subjacente?
Surge do fato de que, em última análise, os computadores representam internamente números em formato binário. Isso leva, inevitavelmente, a erros de arredondamento.
Considere isto:
0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")
As reticências acima [...] significam "infinito". Se você olhar com cuidado, há um padrão de repetição infinito (= '0011')
Então, em algum momento, o computador precisa arredondar esse valor. Isso leva a erros de acumulação decorrentes do uso repetido de números que são inexatamente armazenados.
Diga que deseja armazenar valores financeiros (que são números que podem ter uma parte fracionária). Antes de tudo, você não pode usar números inteiros obviamente (os números inteiros não têm uma parte fracionária). Do ponto de vista puramente matemático, a tendência natural seria usar a float
. Mas, em um computador, os carros alegóricos têm a parte de um número localizado após um ponto decimal - a "mantissa" - limitada. Isso leva a erros de arredondamento.
Para superar isso, os computadores oferecem tipos de dados específicos que limitam o erro de arredondamento binário nos computadores para números decimais. Esses são os tipos de dados que devem ser absolutamente utilizados para representar valores financeiros. Esses tipos de dados geralmente recebem o nome de Decimal
. Esse é o caso em C #, por exemplo. Ou, DECIMAL
na maioria dos bancos de dados.
Embora a pergunta não inclua o tipo de dados MONEY, algumas pessoas que se deparam com esse encadeamento podem ficar tentadas a usar o tipo de dados MONEY para cálculos financeiros.
Desconfie do tipo de dados MONEY, é de precisão limitada.
Há muitas informações boas sobre isso nas respostas a esta pergunta do Stackoverflow:
Você deve escolher os tipos de dados DINHEIRO ou DECIMAL (x, y) no SQL Server?