Estou criando esta API e o banco de dados armazenará valores que representam um dos seguintes:
- percentagem
- média
- taxa
Sinceramente, não tenho idéia de como representar algo que o intervalo esteja entre 0 e 100% em números. Deveria ser
- 0,00 - 1,00
- 0,00 - 100,00
- qualquer outra alternativa que eu não conheça
Existe uma escolha clara para isso? Uma maneira global de representar nos bancos de dados algo que varia de 0 a 100% por cento? Indo além, qual é o tipo correto para ele, float ou decimal?
Obrigado.
int
para representar centésimos ou em unidades de Permyriad ou ‱.Respostas:
Eu vou tomar a posição oposta.
FLOAT
é para números aproximados, como porcentagens, médias etc. Você deve formatar ao exibir os valores, no código do aplicativo ou usando aFORMAT()
função do MySQL.Nunca teste
float_value = 1.3
; existem muitas razões pelas quais isso irá falhar.DECIMAL
deve ser usado para valores monetários.DECIMAL
evita um segundo arredondamento quando um valor precisa ser arredondado para dólares / centavos / euros / etc. Contadores não gostam de frações de centavos.A implementação do MySQL
DECIMAL
permite 65 dígitos significativos;FLOAT
dá cerca de 7 eDOUBLE
cerca de 16. 7 geralmente é mais que suficiente para sensores e cálculos científicos.Quanto à "porcentagem" - às vezes eu uso
TINYINT UNSIGNED
quando quero consumir apenas 1 byte de armazenamento e não preciso de muita precisão; às vezes eu useiFLOAT
(4 bytes). Não há tipo de dados ajustado especificamente para porcentagem. (Observe também que issoDECIMAL(2,0)
não pode conter o valor100
, portanto, tecnicamente, você precisariaDECIMAL(3,0)
.)Ou, às vezes, usei um
FLOAT
que mantinha um valor entre 0 e 1. Mas, então, precisaria me certificar de multiplicar por 100 antes de exibir a "porcentagem".Mais
Todos os três "percentual, média, taxa" cheiram a carros alegóricos, então essa seria minha primeira escolha.
Um critério para decidir sobre o tipo de dados ... Quantas cópias do valor existirão?
Se você tiver uma tabela de bilhões de linhas com uma coluna para uma porcentagem, considere que
TINYINT
isso levaria 1 byte (total de 1 GB), masFLOAT
levaria 4 bytes (total de 4 GB). OTOH, a maioria dos aplicativos não possui muitas linhas, portanto isso pode não ser relevante.Como regra geral, valores "exatos" devem usar alguma forma de
INT
ouDECIMAL
. Coisas inexatas (cálculos científicos, raízes quadradas, divisão, etc.) devem usarFLOAT
(ouDOUBLE
).Além disso, a formatação da saída geralmente deve ser deixada para o front end do aplicativo. Ou seja, mesmo que uma "média" possa ser calculada como "14.6666666 ...", a exibição deve mostrar algo como "14.7"; isso é mais amigável para os seres humanos. Enquanto isso, você tem o valor subjacente para decidir posteriormente que "15" ou "14.667" é a formatação de saída preferível.
O intervalo "0,00 - 100,00" pode ser feito com
FLOAT
e usar a formatação de saída ou comDECIMAL(5,2)
(3 bytes) com a pré-determinação de que você sempre desejará a precisão indicada .fonte
Eu geralmente recomendaria contra o uso
float
. Os números de ponto flutuante representam números na base 2, o que faz com que alguns números (exatos) sejam arredondados em operações ou comparações, porque eles simplesmente não podem ser armazenados com precisão na base 2. Isso pode levar a comportamentos surpreendentes.Considere o seguinte exemplo :
A comparação da base 2 do número
1.3
falha. Isso é complicado.Em comparação, o decimal fornece uma representação precisa de números finitos dentro de seu intervalo. Se você mudar
float
paradecimal(2, 1)
no exemplo acima, obtém os resultados esperados.fonte
A diferença entre float e decimal é a precisão. Decimal pode 100% representar com precisão qualquer número dentro da precisão do formato decimal, enquanto que Float não pode representar com precisão todos os números.
Use decimal para, por exemplo, valor relacionado financeiro e use float para, por exemplo, valor gráfico relacionado
fonte
Eu recomendo usar
decimal(5,2)
se você deseja armazená-lo da mesma maneira que o exibirá, poisdecimal
é para preservar a precisão exata. (Consulte https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html )( https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html )
https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
fonte
Decimal: no caso de aplicativos financeiros, é melhor usar os tipos decimais, pois oferece um alto nível de precisão e é fácil evitar erros de arredondamento.
Duplo: tipos duplos são provavelmente o tipo de dados mais normalmente usado para valores reais, exceto manipular dinheiro.
Flutuar: É usado principalmente em bibliotecas gráficas, porque demandas muito altas de poderes de processamento também usavam situações que podem suportar erros de arredondamento.
Referência: http://net-informations.com/q/faq/float.html
fonte
O decimal fez exatamente o que deveria ser feito nesses casos, truncou o restante, perdendo a parte 1/3.
Portanto, para somas, o decimal é melhor, mas para divisões, o float é melhor, até certo ponto, é claro. Quero dizer, usar DECIMAL não fornecerá "aritmética à prova de falhas" de nenhuma maneira.
Espero que isso ajude.
fonte
Em tsql: Float, 0.0 armazena como 0 e não é necessário definir após o dígito decimal, por exemplo, você não precisa escrever Float (4,2). Decimal, 0,0 armazena como 0,0 e tem opção para definir como decimal (4,2), sugiro 0,00-1,00. Ao fazer isso, você pode calcular o valor dessa porcentagem sem multiplicar por 100 e, se informar, defina o tipo de dados dessa coluna em porcentagem, como o MS Excel e outras plataformas
0.5 -> 50%
.fonte