Quem trabalha ou trabalhou comigo sabe que não sou fã de Javascript. Confesso, é um preconceito formado em épocas remotas do JS, uma época nebulosa, com más experiências.

Hoje em dia, com frameworks como o Prototype ou jQuery, a experiência em se programar com Javascript é outra. A linguagem ainda possui algumas características que me fazem lembrar de Ruby. Mas é claro que ela possui gotchas.

O Carlos Brando enumerou alguns desses gotchas no seu blog. O primeiro caso me chamou a atenção:

>>> 0.1 + 0.2
0.30000000000000004

Mas esse ‘problema’ não é único do Javascript. Como o divoxx mencionou nos comentários do post, isso também acontece em Ruby, a ponto de acontecer:

0.1 + 0.2 == 0.3
=> false

Na verdade, isso acontece até mesmo em C. Olha só, a mãe bastarda de todas as linguagens (já que a mãe de verdade é o Lisp, :D ) também tem esse mesmo ‘bug’. Quer experimentar?

Coloque este texto num arquivo com nome floatness.c:

#include <stdio.h>
 
int main(){
  double a,b,x;
 
  x = 0.1 + 0.2 ;
  printf("%0.17f\n", x);
}

E compile e rode com o comando:

$ gcc floatiness.c -o floatiness
$ ./floatiness
0.30000000000000004

Temos o mesmo resultado. Mesmo em C, 0.1 + 0.2 é diferente de 0.3.

Claro que o Javascript não tem culpa. Na hora de representar um número decimal em binário, coisas estranhas ocorrem. 0.1 em binário transforma-se numa dízima períodica 0.000110011… (veja sobre operações de ponto flutuante na Wikipedia).

Ou seja, isso é normal!

E, infelizmente, isso pode ser surpresa pra muita gente. O ponto é, e tenho certeza que o Carlos Brando concorda comigo, muita gente não sabe Ciência da Computação. Pois aprenda! Vai fazer diferença, pode estar certo disso. Não estou dizendo pra você fazer uma faculdade de Ciência ou Engenharia da Computação. Você pode ser autodidata. Numa época de linguagens como Python e Ruby, onde muita ‘mágica’ acontece nos bastidores, é sempre bom ter uma idéia do que está acontecendo.

Procure livros-textos das matérias da faculdade, vá até bibliotecas de faculdades. Todos as faculdades que se prezam mantém um site com todas as matérias e seu escopo disponíveis para a consulta. Para a USP, por exemplo, você pode acessar o JúpiterWEB (clique em Disciplinas).

Aprenda C. Passe raiva gerenciando memória manualmente e brincando com ponteiros! Faça um algoritmo de ordenação de Array usando várias threads. Leia sobre Quicksort. Bubblesort. Leia sobre estruturas de dados. Cadeias ligadas, cadeias duplamente ligadas. Matrizes esparsas. Leia sobre linguagens funcionais. Aprenda uma.

Todos nós temos um caminho longo pela frente. Mas é sempre bom ter uma base legal para se guiar.

PS: Antes que alguém me xingue, eu fiz Engenharia de Automação e Controle, ou seja, algo não muito relacionado à Computação. Meus estudos sobre Ciência e Engenharia da Computação foram fora da sala de aula e tenho ainda muita coisa pra aprender. Sei disso e não sou nenhum sabichão para falar ‘olha.. eu sei de tudo.. manjo muito disso tudo.. siga meu caminho, siga o que eu fiz e você se dará bem’. Não é essa a idéia do post. A idéa é apenas motivar todos (eu inclusive) a estudar cada vez mais e melhorar cada vez mais nosso ecossistema de desenvolvedores.

Tags: , , , ,