Tipos Long, Big Decimal, Int, Double

Boa tarde,

Estou tentando fazer a continha abaixo no meu JSP:

( (qntTotal - atraso) / qntTotal ) * 100;

<%
int qntTotal  =  procFin.get(procFin.size()-1).getQntTotal();
int atrasoSup =  procFin.get(procFin.size()-1).getAtrasoSuprimentos();

out.println("Quantidade Total: " + qntTotal);
out.println("Quantidade Total: " + atrasoSup);

Double prazo = (double) ( ( (qntTotal - atrasoSup) / qntTotal ) * 100 );

out.println("Meta Prazo: "+ prazo );
%>

O resultado sai assim:

Quantidade Total: 110 Quantidade Total: 36 Meta Prazo: 0.0

Porem se vocês fizerem as contas dá o resultado de 67,27 e nao 0.0.

O que esta acontecendo? Já tentei colocar os tipos Int, Long, Big Decimal, Double mas nada resolve, sempre dá o 0.0.
Tentei ‘diminuir a conta’ para saber onde esta o problema, descobri que a subtraçao ele faz certinho, o problema esta quando ele divide. O que é isso?

Boa tarde.
Se você trocar o tipo int por double, funcionara.

int qntTotal  =  procFin.get(procFin.size()-1).getQntTotal();   
int atrasoSup =  procFin.get(procFin.size()-1).getAtrasoSuprimentos();   



double qntTotal  =  procFin.get(procFin.size()-1).getQntTotal();   
double atrasoSup =  procFin.get(procFin.size()-1).getAtrasoSuprimentos();   

[quote=diego.sas]Boa tarde.
Se você trocar o tipo int por double, funcionara.

[code]
int qntTotal = procFin.get(procFin.size()-1).getQntTotal();
int atrasoSup = procFin.get(procFin.size()-1).getAtrasoSuprimentos();

double qntTotal = procFin.get(procFin.size()-1).getQntTotal();
double atrasoSup = procFin.get(procFin.size()-1).getAtrasoSuprimentos();
[/code][/quote]

Que coisinha simples!!! Obrigada! Funcionou!!!

Cara eu testei assim e deu certo, más não sei dizer ao certo pq o seu codigo nao funcionou.


public class Teste {

    public static void main(String dfdf[]) {
        int qntTotal = 110;
        int atrasoSup = 36;
        out.println("Quantidade Total: " + qntTotal);
        out.println("Quantidade Total: " + atrasoSup);

        double aux = (double) ((qntTotal - atrasoSup));
        Double prazo = aux / qntTotal * 100;

        out.println("Meta Prazo: " + prazo);

    }
}
 [b]saida =Meta Prazo: 67.27272727272727[/b]

Boa tarde Ellensmp

Oque ocorre é o seguinte: vc faz: (( qntTotal - atrasoSup ) / qntTotal ) * 100 )

Quando ele faz: ( ( qntTotal - atrasoSup ) / qntTotal = ( 110 - 36 ) / 110.

O compilador trata essa expressão toda como um inteiro. Oque dá 0, pois inteiro não tem casa decimal. Então 0 * 100 = 0. Vc só está fazendo o cast para double depois que já encontrou o valor de 0.

vlw

Diogo acho que não tem como ele tratar tudo como inteiro pois há uma divisão. Tenho uma teoria:

Aqui estamos lidando com inteiros:

(qntTotal - atrasoSup) = 74

Aqui já estamos lidando com ponto flutuante:

(qntTotal - atrasoSup) / qntTotal )=0,67

Aqui o valor acima (0,67) é convertido para integer - resultando em 0 - e multiplicado por 100

(0 * 100) = 0

Nisso é feito o casting (de int para double) + autoboxing (double para Double) transformando o 0 em 0.0.

Alguém aceita esta teoria?

Melhor explicado emmanuelrock. ehehhe

estou aprendendo, mas a sua tá certa mesmo.

vlw

Valeu, e eu também estou aprendendo :slight_smile: