1
resposta

Continuo com dúvidas

É a segunda vez que o instrutor explica esse tema, mas novamente de maneira muito rasa. De fato não consegui entender, nessa aula, as diferenças entre os campos numéricos.

Escrevi esse texto a partir do livro SQL para Leigos, com o objetivo de ajudar aqueles que, como eu, percorreram sem sucesso fóruns pra tentar entender essa desgraça. Sou iniciante em SQL, de modo que isso é apenas um resumo do que eu entendi do que se explica no livro. Agradeço por correções e complementações. E por explicações, por favor, já que deixo claro no texto aquilo que ainda não entendi sobre o assunto. Diferença entre os decimais de ponto fixo e de ponto flutuante: Decimais de ponto fixo servem para guardar números fracionários (também chamados racionais). Aqui se inserem os conceitos de precisão e escala. A precisão é a quantidade total de dígitos, enquanto que a escala é a quantidade de casas decimais. Num número como 88,88888, a precisão é sete e a escala é cinco. Decimais de ponto flutuante servem para guardar qualquer número real. Os números reais são um conjunto amplo, que abarca tanto os racionais quanto os irracionais. Um exemplo de número irracional é o pi (π), que tem um número infinito de casas decimais, que sempre arredondamos em alguma medida. Ou seja, podemos guardar 3,14; 3,14159; etc: diferentes ordens de grandeza. O ponto (vírgula pra nós) é flutuante, pois se “move” em relação à escala. Nestes decimais trabalha-se com dois conceitos: expoente e mantissa, que dizem respeito à notação científica. Por exemplo, o número 1.234 (aqui o ponto é separador de milhar) pode ser escrito como 1,234E3 – que significa 1,234*10³. Nesse caso, 1,234 é a mantissa, e 3 é o expoente. São esses dois elementos que o banco grava, o que, num número com muitos zeros significativos à direita, economiza espaço de armazenamento. Decimais de ponto fixo – diferença entre NUMERIC e DECIMAL Especificando um campo como NUMERIC (10), onde dez indica o número de dígitos totais, o número armazenado pode ser algo como 257,5114567 ou 25.751.145,67 etc. Ou seja, a vírgula se desloca livremente, mas a quantidade total de dígitos é dez. Especificando o NUMERIC como (10,4), por exemplo, a precisão é de 10 dígitos e a escala de 4. Desse modo fixa-se o lugar da vírgula: 257.511,4567. Cada implementação de SQL tem uma precisão e uma escala padrões, que não se pode ultrapassar na especificação. Por sua vez, a implementação do SQL deve estar dentro da precisão e escalas máximas que o hardware suporta. (Não estou certo do que disse neste parágrafo, com relação à capacidade da implementação versus a do hardware. O livro não é muito claro.) Uma máquina de 64 bits fornece mais precisão que uma de 32 bits. No campo NUMERIC, se não se especifica o número de dígitos, a implementação do SQL assume que é igual à sua máxima capacidade. Mas, se se especifica, o banco gravará exatamente a especificação. O DECIMAL se diferencia porque, ainda que se especifique a precisão, o banco pode especificar uma precisão maior, caso a comporte. (Pra isso fazer sentido, imagino que o livro se refira a uma migração de dados em que o registro original tem maior precisão que o especificado no banco para o qual está sendo migrado. Ou que a aplicação permita mais dígitos do que o banco.) O DECIMAL tem uma desvantagem em uma migração de sistemas, já que o limite suportado por uma implementação pode ser diferente do suportado por outra. Decimais de ponto flutuante – diferença entre REAL, DOUBLE PRECISION e FLOAT No campo de tipo REAL não se especifica a precisão. Ela é exatamente a máxima suportada pela implementação de SQL. Já o DOUBLE PRECISION tem sempre capacidade maior que o REAL, tanto pra mantissa quanto pro expoente. A depender da implementação, pode ser exatamente o dobro ou menos. (Não entendo como o DOUBLE PRECISION pode ter capacidade maior que o REAL, se este já usaria a capacidade total da implementação. Se alguém entendeu, por favor me explique.) “...o tipo de dados FLOAT permite especificar a precisão e deixa que o hardware cuide de decidir qual aritmética usar, entre precisão simples ou dupla.” (Realmente não entendi nada, exatamente porque não sei o que é aritmética de precisão dupla.) O livro ainda diz que, entre os tipos de ponto flutuante, o FLOAT é o que melhor se adapta a uma migração de sistemas. Não sei por que, mas no tipo FLOAT, não dá pra fazer uma busca ou um filtro com o número exato. Só dá pra “pegar” o número usando filtros de maior ou menor.

1 resposta

Olá Bruno, tudo bem? Muito legal sua contribuição aqui no fórum, e realmente esse é um assunto que pode ser um pouco confuso, vou tentar explicar essas partes que você não conseguiu compreender!

Bem sobre a parte: "Por sua vez, a implementação do SQL deve estar dentro da precisão e escalas máximas que o hardware suporta.", então isso tem a ver com hardware da máquina em que o banco de dados está em execução, isso porque, uma computador de 64 bits pode processar instruções e lógicas maiores e mais complexas do que um computador de 32 bits. Então o SQL tem os tamanhos porém o computador precisar ter um poder de processamento legal para poder armazenar e manipular os valores ao extremo.

Sobre "o DECIMAL se diferencia porque, ainda que se especifique a precisão, o banco pode especificar uma precisão maior, caso a comporte." O DECIMAL é como você mesmo falou, sempre armazenado utilizando o seu comprimento total, mesmo que você indique um tamanho menor, ele sempre cria utilizando o comprimento máximo.

Agora sobre: "Já o DOUBLE PRECISION tem sempre capacidade maior que o REAL, tanto pra mantissa quanto pro expoente. A depender da implementação, pode ser exatamente o dobro ou menos". Isso, porque o REAL tem sete dígitos de precisão (precisão única), já o FLOAT (DOUBLE é um sinônimo de FLOAT)tem 15 dígitos de precisão. Informações do SQL Server .

Sobre "o tipo de dados FLOAT permite especificar a precisão e deixa que o hardware cuide de decidir qual aritmética usar, entre precisão simples ou dupla”, isso é coisas da matemática, e você pode ler mais sobre isso nesse link: Precisão e precisão em cálculos de ponto flutuante.

O FLOAT é o que melhor se adaptar numa migração porque ele é o menor dentre os tipos de ponto flutuante, assim ele pode ser armazenados em campos com tipos maiores.

Espero ter contribuído e esclarecido suas dúvidas!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software