"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que as comparações de ponto flutuante no MySQL são imprecisas?

Por que as comparações de ponto flutuante no MySQL são imprecisas?

Publicado em 2024-11-20
Navegar:100

Why are Floating-Point Comparisons in MySQL Inaccurate?

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.

Tutorial mais recente Mais>

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