Cuidado com floats em Linguagens de Programação
Muito Cuidado ao trabalhar com Números em Ponto Flutuante em várias linguagens de programação e em dois SGBDs.
Se estiver trabalhando e precise de extrema precisão use float com muita cautela e melhor ainda é não usar float quando for efetuar operações matemáticas que exijam precisão. Neste caso prefira outros formatos ou um SGBD como MySQL ou PostgreSQL.
Veja os exemplos com detalhes abaixo:
PHP
Java
JavaScript
Ruby
Python
MySQL
PostgreSQL
Teste em PHP
<?php
echo (int) ((0.1 + 0.7 ) * 10);
?>
Agora teste isso:
echo (int) ((0.2 + 0.7 ) * 10);
Não conclua muito apressadamente que é deficiência do PHP, veja abaixo com outras linguagens.
Neste momento devemos ter conhecimento de como se comportam os números, especialmente os floats, que são normalizados pelo IEEE.
Teste em Java
nano teste.java
class teste {
public static void main(String[] args) {
System.out.println((int) ((0.1 + 0.7 ) * 10)); //Display the string.
}
}
javac teste.java
java teste
Agora veja as recomendações do manual do PHP
O tamanho de um float depende também da plataforma e é de 64bits no formato IEEE(*). Nunca compare números em ponto flutuante em igualdades, sob pena de cometer erros.
Agora com JavaScript
<script>
alert((0.1 + 0.7)*10);
</script>
Resultado razoável: 7.999999999999999
Com MySQL
SELECT (0.1 + 0.7)*10
Resultado correto: 8.0
Teste com PostgreSQL
SELECT CAST((0.1 + 0.7)*10 AS INTEGER);
Resultado correto: 8
Os SGBDs retornam o valor esperado.
Java e PHP:
System.out.println(1.95 - 1.03);
Retorna 0.9199999999999999
Em PHP
print (1.95 - 1.03);
Retorna 0.92.
Em Ruby
Execute em:
https://repl.it/languages/ruby
(1.8+0.1)==(1.9)
Retorna false
Em Phyton.
https://repl.it/languages/python3
print (1.8+0.1)
Resultado razoável: 1.9000000000000001
Conclusão
Ou seja, fique atento quando precisar realizar operações matemáticas com floats em linguagens de programação.
O MySQL e o PostgreSQL trabalham bem, pelo menos com os rápidos testes que fiz.
Comments fornecido por CComment