Don't you speak portuguese? Translate this site with Google Translator

Pensamento do Dia

O que dá sentido à vida é mais importante que a própria vida. (Autor desconhecido)

Cuidado com floats em Linguagens

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

Novo Testamento

Determina outra vez um certo dia, Hoje, dizendo por Davi, muito tempo depois, como está dito: Hoje, se ouvirdes a sua voz, Não endureçais os vossos corações.
(Hb, 4:7)

Rotas no Mapa do Google

© 2015 Ribamar FS. All Rights Reserved. Designed By JoomShaper