Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvidas em Javascript - Iniciante

Boa tarde, amigos.

Comecei meus estudos em linguagem de programação após vários anos trabalhando apenas com HTML e CSS. Tudo que eu usava de javascript ou PHP sempre foi coisas prontas de outros desenvolvedores. Então depois de terminar de estudar lógica de programação, comecei a estudar javascript e C#.

No momento estou com uma dúvida simples em javascript:

No console do Google Chrome, ao digitar:

1 + 82/100 o resultado é 1.8199999999999998

Enquanto que digitando

(1 * 100 + 82) / 100 o resultado é 1.82

Lógico que a diferença é extremamente desprezível. Mas simplesmente NÃO ENTENDI por que tem essa diferença. Alguém pode me esclarecer?

Outra dúvida simples:

Atribuindo uma id a tag FORM do HTML, posso criar um objeto com ela do tipo

var formulario = document.getElementById("ID_DO FORMULARIO");

e então posso acessar seus elementos internos assim:

var nome = formulario.name_do_elemento.value;

Entretanto tal recurso não funciona se eu utilizar o objeto em outro elemento tipo um fieldset. Atribuir o ID ao fieldset e depois criar um objeto com isso.

Alguém pode me elucidar sobre essas situações?

3 respostas
solução!

Então, vc esbarrou num dos problemas mais famosos da computação como um todo: como lidar com ponto flutuante em máquinas binárias.

A resposta curta é que existe um padrão internacional de como lidar com ponto flututante e o JavaScript e muitas outras linguagens seguem. E nesse padrão, tentamos representar números com casas decimais numa notação de 0 e 1s que é imprecisa. A própria mudança de base decimal para binária já causa arredondamentos.

Não tem muito o que fazer, é assim que funciona mesmo. Existem bibliotecas para se trabalhar com matemática em ponto flutuante no nível de software ao invés do hardware, que conseguem lidar com isso melhor.

Ou, em muitos cenários, dá pra trabalhar com números inteiros. Exemplo é moeda. Para representar R$ 10,23 ao inves de usar um float 10.23, usar um inteiro 1023 (e só colocar a vírgula na hora de exibir). Aliás, é mais ou menos isso que você fez ao multiplicar por 100 e depois dividir de novo.

O exemplo mais clássico desse erro de arrendondamento que parece tão simples e trivial é o 0.1 + 0.2 que não dá 0.3 :-P

Ah e se quiser se aprofundar nisso e entender a matemática por trás, esse artigo na Wikipedia explica:

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

Como assim 0.1 + 0.2 dá 0.30000000000000004 ?

EAIHEUIAHUEIAHUIEAHUIEAHUI bugou minha mente toda aqui.

Vou ter que ler este artigo para entender. Perdoe-me, mas isso parece até piada.

Quanto ao segundo questionamento, alguma posição?