Eu queria validar um número, para saber se e inteiro ou decimal, tipo nesse exemplo abaixo com o valor da variável d.
Se essa divisão der um numero inteiro ele para (break), senão ele continua, incrementando o valor da variável Naux, ate encontrar um número que seja inteiro.
Alguem pode me ajudar nisso dai?
[color=blue]int d = 0;
while(true)
{
d = (1 + z*Naux) / n;
System.out.println(d); if (d …)
{
result = d;
Naux = 0;
break;
}
else Naux++;
Quando você faz contas com ponto flutuante, não deve se esquecer de que um resultado nunca é exato. Mesmo que eu lhe dissesse que você poderia fazer algo como:
Math.rint (d) == d
para dizer que um número é inteiro, isso não seria adequado - pode ser que alguma vez o seu algoritmo entrasse em loop.
O correto é chegar a uma aproximação adequada, por exemplo:
Math.abs (Math.rint (d) - d) <= 1E-10
se quiser que o seu número seja inteiro, a menos de um erro de 10 elevado a -10.
vi que existe uma forma de pegar a parte inteira do decimal, mas nao existe uma forma de pegar o que vem depois da virgula/ponto. Assim seria so ver se eh zero.
[quote=micheljuca]vi que existe uma forma de pegar a parte inteira do decimal, mas nao existe uma forma de pegar o que vem depois da virgula/ponto. Assim seria so ver se eh zero.[/quote]Existe, é só diminuir o decimal do inteiro… 20.00001 - 20 = 0.00001, que é diferente de 0.
Até aí tudo bem, mas o problema original era calcular um determinado número via aproximações sucessivas (pelo que imagino).
Via aproximações sucessivas, pode ser que você nunca chegue ao tal número inteiro - não é que você tenha algo do tipo “0, 0.9, 0.99, 0.9999” e não consiga chegar a 1, já que a precisão é finita.
O problema é que as contas podem ficar paradas em um determinado ponto - como “0.9999, 0.9999, 0.9999” etc. e nunca chegar ao tal número inteiro.
Por isso, é melhor estabelecer uma determinada tolerância e pegar o número mais próximo possível, mas não exatamente inteiro, porque pode ser que você tenha um programa em loop.