Desafios de comparação de ponto flutuante do MySQL
Os usuários do MySQL geralmente encontram imprecisões ao comparar valores de ponto flutuante. Considere o seguinte exemplo:
CREATE TABLE users (points float);
INSERT INTO users VALUES (50.12); INSERT INTO users VALUES (34.57); INSERT INTO users VALUES (12.75);
A consulta SELECT COUNT(*) FROM users WHERE points > "12.75" retorna 3, apesar de esperar uma contagem de 2.
O problema com aritmética de ponto flutuante
MySQL usa aritmética de ponto flutuante para armazenar e manipular valores do tipo flutuante. Este sistema representa números usando uma combinação de um significando (o número real) e um expoente, resultando em possíveis problemas de precisão. Por exemplo, o valor 12,75 pode ser armazenado como 12,75000005722 quando inserido no MySQL devido à representação binária de números de ponto flutuante.
Representação decimal exata
Para evitar tal imprecisões, é recomendado usar o tipo de dados DECIMAL no MySQL para representação decimal precisa. Ao contrário de float, DECIMAL armazena valores como números de ponto fixo, garantindo precisão exata.
Convertendo para DECIMAL
Para converter uma coluna flutuante existente para DECIMAL, use ALTER TABLE instrução:
ALTER TABLE users MODIFY points DECIMAL(6,2);
Isso converterá pontos em uma coluna decimal com 6 dígitos no total e 2 casas decimais. Você pode ajustar a precisão e a escala conforme necessário.
Conclusão
Embora float possa parecer conveniente, as imprecisões inerentes à aritmética de ponto flutuante podem levar a resultados inesperados ao comparar valores. Para representação decimal precisa e comparações precisas, é altamente recomendável usar o tipo de dados DECIMAL no MySQL. Ao usar DECIMAL, você pode evitar as possíveis armadilhas das comparações de ponto flutuante e garantir a confiabilidade de seus dados.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3