1
resposta

Limite de dígitos em números decimais

Boa noite.

Minha dúvida é simples: há algum limite para o número de dígitos em um campo de ponto flutuante? Posso declarar um campo como "float(277,2)"?

1 resposta

Consulte a referência do mysql, por exemplo https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html nos diz:

Os tipos FLOAT e DOUBLE representam valores aproximados de dados numéricos. O MySQL usa quatro bytes para valores de precisão simples e oito bytes para valores de precisão dupla.

Para FLOAT, o padrão SQL permite uma especificação opcional da precisão (mas não o intervalo do expoente) em bits após a palavra-chave FLOAT entre parênteses; ; isto é, FLOAT (p). O MySQL também suporta essa especificação de precisão opcional, mas o valor de precisão em FLOAT (p) é usado apenas para determinar o tamanho do armazenamento. Uma precisão de 0 a 23 resulta em uma coluna FLOAT de precisão única de 4 bytes. Uma precisão de 24 a 53 resulta em uma coluna DOUBLE de dupla precisão de 8 bytes.

O MySQL permite uma sintaxe fora do padrão: FLOAT (M, D) ou REAL (M, D) ou DOUBLE PRECISION (M, D). Aqui, (M, D) significa que os valores podem ser armazenados com até M dígitos no total, dos quais D dígitos podem ser após o ponto decimal. Por exemplo, uma coluna definida como FLOAT (7,4) será semelhante a -999.9999 quando exibida. O MySQL executa arredondamentos ao armazenar valores, portanto, se você inserir 999.00009 em uma coluna FLOAT (7,4), o resultado aproximado é 999.0001.

A partir do MySQL 8.0.17, a sintaxe não padronizada FLOAT (M, D) e DOUBLE (M, D) é preterida e o suporte para ela será removido em uma versão futura do MySQL.

Como os valores de ponto flutuante são aproximados e não são armazenados como valores exatos, as tentativas de tratá-los como comparações exatas podem causar problemas. Eles também estão sujeitos a dependências de plataforma ou implementação. Para obter mais informações, consulte a Seção B.4.4.8, “Problemas com valores de ponto flutuante”

Para máxima portabilidade, o código que requer armazenamento de valores de dados numéricos aproximados deve usar FLOAT ou DOUBLE PRECISION sem especificação de precisão ou número de dígitos.


Dependendo do caso sugiro o tipo DECIMAL OU NUMERIC ( https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html)

Os tipos DECIMAL e NUMERIC armazenam valores de dados numéricos exatos. Esses tipos são usados quando é importante preservar a precisão exata, por exemplo, com dados monetários. No MySQL, NUMERIC é implementado como DECIMAL, então as seguintes observações sobre DECIMAL se aplicam igualmente a NUMERIC.

O MySQL armazena valores DECIMAL em formato binário. Veja a Seção 12.25, “Matemática de Precisão”.

Em uma declaração de coluna DECIMAL, a precisão e a escala podem ser (e geralmente são) especificadas. Por exemplo:

salário DECIMAL (5,2) Neste exemplo, 5 é a precisão e 2 é a escala. A precisão representa o número de dígitos significativos que são armazenados para valores e a escala representa o número de dígitos que podem ser armazenados após o ponto decimal.

SQL padrão requer que DECIMAL (5,2) seja capaz de armazenar qualquer valor com cinco dígitos e duas casas decimais, assim valores que podem ser armazenados na coluna salarial variam de -999.99 a 999.99.

No SQL padrão, a sintaxe DECIMAL (M) é equivalente a DECIMAL (M, 0). Da mesma forma, a sintaxe DECIMAL é equivalente a DECIMAL (M, 0), onde a implementação tem permissão para decidir o valor de M. O MySQL suporta ambas as formas variantes da sintaxe DECIMAL. O valor padrão de M é 10.

Se a escala for 0, os valores DECIMAIS não contêm ponto decimal ou parte fracionária.

O número máximo de dígitos para DECIMAL é 65, mas o intervalo real para uma determinada coluna DECIMAL pode ser limitado pela precisão ou pela escala de uma determinada coluna. Quando uma coluna desse tipo recebe um valor com mais dígitos após o ponto decimal do que o permitido pela escala especificada, o valor é convertido para essa escala. (O comportamento preciso é específico do sistema operacional, mas geralmente o efeito é o truncamento para o número permitido de dígitos.)