4
respostas

Alternativa certa ou errada com comparação entre números de pontos flutuantes

Olá! De acordo com o exemplo citado na videoaula:

1 == (100.0 / 100) pode não ser verdadeiro caso a divisão tenha uma precisão não exata.

se houver uma alternativa com uma comparação como nesse exemplo, é melhor considerá-la certa ou errada?

4 respostas

Fala, Philippo!

Nesse caso que você apresentou, o resultado será true. Entretanto, se você alterar a precisão do numerador, de 100.0 para 100.1, por exemplo, o resultado será false.

Indo para a sua pergunta: se houver algo nesse sentido, será de fácil compreensão (como esse 100.0/100 ou 100.1/100). São questões onde não é necessário fazer cálculo para se perceber que o resultado não será exato e diferente de um número inteiro (como o 1, nesse seu exemplo).

Abraço.

Entendi! A minha dúvida estava relacionada em como o exame enxerga uma alternativa como essa. Se para o exame de certificação, é dado como certo ou errado, por causa da precisão não exata que foi comentado na videoaula.

Mas, se fizer esse cálculo do exemplo, a resposta seria 1(int) == 1.0(double), não?

O que acontece "por debaixo dos panos" é que o int será convertido para double (e não há perda de valores, pois não há casas de precisão no int), daí a operação será double/double. Dessa forma 1/1.0 será convertido para 1.0/1.0 antes de ocorrer a divisão.

Se você compreender inglês (nada que um google translator não ajude também), pode dar uma olhada nesses links:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.20.1

https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

Qualquer coisa, estamos por aqui... Abraço.

A lógica da comparação eu entendi (e o resultado final também, que será double/double).

O que me deixou confuso foi nesse trecho que eu tirei da parte teórica da aula, que diz: "pode não ser verdadeiro caso a divisão tenha uma precisão não exata".

Se o resultado final será double/double (1.0 ==1.0), por que pode não ser verdadeira a comparação, de acordo com esse exemplo dado na parte teórica?

Minha dúvida é na parte textual mesmo. Eu não sei se o que ele escreveu/disse pode ter sido passado de forma "errônea", querendo abranger outros tipos de comparação e acabou englobando esse exemplo ou se realmente tem alguma relação com esse exemplo que foi dado na aula.

Essa prova é toda macetada, então, eu estou muito preocupado com as pegadinhas haha Outro instrutor tirou uma outra dúvida minha, quando perguntei se a prova troca os verbos para enganar quem a está fazendo (o que eu acho ridículo, pois o exame quer saber se o candidato cai ou não nas pegadinhas, ao invés de conhecer ou não o conteúdo de Java).

Aí eu não se essa frase que o instrutor disse nessa aula, de que "pode não ser verdadeiro" tem relação direta com esse exemplo ou se ele quis dizer para outros casos de comparação (como o que você mencionou, de 100.0 para 100.1, por exemplo, que teria um resultado false).

Eu sei que, no exemplo, o resultado será true, mas por que o instrutor disse que "pode não ser verdadeiro", em vez de dizer que "será verdadeiro" ou algo do gênero?