Por que int/int = int?

Seguinte pessoal,

só estou postando isto aqui pq já procurei em alguns lugares e ahei nada, perguntei a uns amigos e ninguem me deu uma resposta convincente. A dúvida é a seguinte:

imagine o seguinte código:

double a;
a = 3 / 2;
System.out.println(a);

Isto daria a saida 1.

eu sei que fazendo:

double a;
a = 3d / 2d;
System.out.println(a);

daria 1.5 de saida(o que me parece correto).

Eu queria saber O MOTIVO pelo qual uma divisão entre dois inteiros retorna um valor inteiro independentemente do tipo da variável para onde está sendo passado o resultado.

eu até entendo q o contrário:

int a;
a = 3d / 2d;
System.out.println(a);

retorne 1.

soh gostaria de uma resposta, ou um lugar onde eu consiga achar a resposta… qq dica q me ajude a esclarescer esta dúvida.

Muito Obrigado

Acredito que seja por que quando se usa int/int, ele encara como sendo a operação DIV, aquela em que se retorna somente a parte inteira da divisão, enquanto o % seja o MOD, que retorna o restso da divisão, e para se ter o resultado esato, é preciso utilizar outro tipo primitivo, como float, por exemplo.

Eu penso assim: que o compilador sempre retorna o tipo de variavel que esta sendo usada na operação! se utiliza 2 int ele retorna int, se utiliza um int e um double ele retorna double (por um int caber em um double e não o contrario)!

se vc tivesse feito assim:
double a ;
a = 3 /2.0
retornaria 1.5 .

agora isso tudo são convensôes, ou seja regra de sintaxe do java, outras linguagens pode tratar de forma diferente!

Agora o POR QUE que eles adotaram desta forma só eles podem responder! o fato é que isto é uma convensão ou seja! java adotou esta lógica, mas não é uma regra geral cada linguagem adota a maneira que bem entende!

Acho que mais compliquei do que expliquei heheh mas eh isso ai

[]s victor

Ola…

Olha pelo q entendi vc deve estar confundindo os operadores@

em java temos dois operadores utilizados na divisao, o q divide mesmo e o resto da divisao

c vc for usar esse codigo double a = 3 / 2;

Vc teria o resultado 1.5 n e??

mas c vc usar assim

int a = 3 % 2

o / e a divisao em si, mas o %(modulo) vc tem o resto da divisao!

Entendeu ?? :razz:
espero ter exclarecido a sua duvida!

Bem, concordo mais com o q o sens disse, que isto é uma conveção, porém me parece mais lógico que o compilador use o tipo do “destino” da operação para fazer o cast, mas ainda não cheguei ao ponto de discutir a lógica do compilador do Java…ehehehe eu SÓ(:grin:) queria saber o motivo(isso tah virando uma questão de honra).

e soh para esclarecer vejam os testes(o último foi mais por desencargo de consciencia)

public class Teste1 {

	public static void main(String[] args) {
		
		double a = 3 / 2;
		System.out.println(a);
		
		double b = 3d / 2d;
		System.out.println(b);
		
		int c = 3 / 2;
		System.out.println(c);
		
		int d = (int)(3d / 2d);
		System.out.println(d);
	}
}

Saída no console:

1.0
1.5
1
1

ahh… soh mais uma coisa… pelo menos nesse caso, eu sei o q o Java faz, não eh isto q estou discutindo, o que eu nao sei eh PORQUE ele faz deste jeito.

Obrigado pela atenção…
acho q depois de umas 5 certificações eu descubro isto…ehehehehehe

isso acontece pq na hora de executar sera executado passo a passo,

se vc tem:

double x;
x = 3 / 2;

a primeira coisa que ele vai fazer eh dividir o 3 por 2, ele nem vai verificar onde vai amarzenar, como o 3 e o 2 sao int, o resultado sera um int, depois ele vai atribuir a x, dai entaum ele vai converter o resultado (1) pra double e armazenar em x…

se convertece tudo pro tipo em que vai ser armazenado seria horrivel, imaginem essa situacao:

pubic void algumaCoisa(int x, double y){
 double z = y + (x / 2);
}

se a intensao fosse uma divisao inteira de x / 2, teria que ser feito em uma variavel separada, se nao converteria direto…

e tb, com essa logica de converter tudo direto, nao seria possivel usar o cast, o que seria um problema para pegar o que tem depois da virgula de um numero:

public double getVirgula(double x){
 x -= (int)x;
 return x;
}

teria que criar uma variavel int soh pra armazenar o x e depois diminuir…

Felipe… primeiro, obrigado pela atenção…
o legal foi q vc percebeu exatamente o q eu quero entender e tocou bem na ferida…

isso que parece logico para todos os programadores Java que eu conheco nao parece nada logico para mim que tenho apenas 6 meses de experiencia com o Java(mas ja sou programador a quase 11 anos). Não estou dizendo que eh certo ou errado, mesmo pq c isto fosse um erro o Java nao teria chegado ao ponto de desenvolvimento atual.

o que me parece lógico eh seguir a ordem “natural” da matematica, quer dizer, um inteiro dividido por outro inteiro NAO NECESSARIAMENTE deve resultar em outro inteiro… compreende?

seria algo tipo…

qqtn = “qualquer tipo numerico”

qqtn/qqtn = double;

e depois faz o cast do double para o tipo da variavel de destino…

exemplo:

[code]double x;
int y;

x = 3/2;//(resultaria em x =1,5);
y = 3/2;//(resultaria em y = 1);
[/code]

o Java deve ter um outro motivo, tipo performace ou compatibilizar os tipos primitivos com a OO ou outra coisa, e eh justamente este tipo de resposta que eu estou procurando.

isto eh mais uma questao(vou inventar um termo agora) tecnofilosófica.
de qq forma, obrigado.

[quote=“Ratinho”]Ola…

Olha pelo q entendi vc deve estar confundindo os operadores@

em java temos dois operadores utilizados na divisao, o q divide mesmo e o resto da divisao

c vc for usar esse codigo double a = 3 / 2;

Vc teria o resultado 1.5 n e??

mas c vc usar assim

int a = 3 % 2

o / e a divisao em si, mas o %(modulo) vc tem o resto da divisao!

Entendeu ?? :razz:
espero ter exclarecido a sua duvida![/quote]

ola pessoal legal essa discursao é interresante realmente essa do java é meio estranho gostaria de saber se alguem tem um explicacao “cientifica” ou seja se alguem sabe o motivo real dessa operacao o “PQ” pq nos sabemos realmente como funciona mas se tem algum motivo especial.

o ratinho se tem q ler primeiro os topicos pr responder se nao complica hehhe :lol: :oops:

esse rapaz q postou o topico trabalha comigo e nos estamos dicutindo esse assunto aqui na empresa.

[quote=“maxwellleonardo”]Felipe… primeiro, obrigado pela atenção…
o legal foi q vc percebeu exatamente o q eu quero entender e tocou bem na ferida…

isso que parece logico para todos os programadores Java que eu conheco nao parece nada logico para mim que tenho apenas 6 meses de experiencia com o Java(mas ja sou programador a quase 11 anos). Não estou dizendo que eh certo ou errado, mesmo pq c isto fosse um erro o Java nao teria chegado ao ponto de desenvolvimento atual.

o que me parece lógico eh seguir a ordem “natural” da matematica, quer dizer, um inteiro dividido por outro inteiro NAO NECESSARIAMENTE deve resultar em outro inteiro… compreende?

seria algo tipo…

qqtn = “qualquer tipo numerico”

qqtn/qqtn = double;

e depois faz o cast do double para o tipo da variavel de destino…

exemplo:

[code]double x;
int y;

x = 3/2;//(resultaria em x =1,5);
y = 3/2;//(resultaria em y = 1);
[/code]

o Java deve ter um outro motivo, tipo performace ou compatibilizar os tipos primitivos com a OO ou outra coisa, e eh justamente este tipo de resposta que eu estou procurando.

isto eh mais uma questao(vou inventar um termo agora) tecnofilosófica.
de qq forma, obrigado.[/quote]

como eu jah disse, na hora de executar ele nao ve a expressao inteira de uma vez, eh executado calculo por calculo… se vc tem:

x = 3 / 2;

ele vai primeiro dividir o 3 / 2, sem nem verificar o x, como eh int / int ele nao vai fazer nenhuma conversao, se um dos numeros (ou ambos) for double, ele converte automaticamente pra double (resultando em 1.5), somente depois que tem o resultado que vai executar:

x = (resultado da operacao);

dai se x for double, o resultado vai ser convertido pra double, se for int eh armazenado em int…

imagine essa situacao:

int x = 3 / 2;

nesse caso, se 3 / 2 fosse resultar em double, logo em seguida teria que armazenar um double em um int, o que da erro…

e se fosse verificado no que vai ser armazenado, esse codigo daria problemas:

int x;
double y;
y = x = 3 / 2;

pra poder armazenar em x, seria a ser obrigado a ser um int (1), e como em seguida vai atribuir x em y, o y teria que ser 1.0, enquanto desse jeito:

double y;
y = 3 / 2;

o y seria 1.5, ou seja, a mesma expressao dando resultados diferentes em expressoes iguais…

em C/C++ eh a mesma logica…
na minha opiniao, do jeito que ta eh mais logico…

cara é simples assim:

se vc usa dois inteiros com o operador /, não interessada pra onde ele vai, uma coisa é certa, só vai o quociente inteiro da divisão, é como o div de outras linguagens, mas nesse seu exemplo o quociente inteiro da divisão é 1 e foi atribuido a um double, daí ficou 1.0

Pessoas,
muito obrigado pelos comentários, mas eu gostaria de encerrar esta discussão por aqui, pelo menos por enquanto.

Acho que somente uma ou duas pessoas(das que responderam) pelo menos entendeu a questão, os outros simplesmente não entenderam nada.

Não me interessa O QUE o Java faz, isto aqui não é uma discussão prática. Eu quero saber O PORQUE dele fazer deste jeito.

:arrow: Esqueçam o computador, peguem um papel e um lápis e façam a seguinte continha:

3 dividido por 2

:arrow: pois é… quanto deu???

isto pra mim(e pra muitos outro programadores que eu conheço) é o jeito certo, mas pro Java não é, e eu quero entender qual foi a lógica usada pra isto ser feito assim… SOH ISSO…

Ninguém precisa responder este tópico, eu mesmo vou responder quando conseguir uma resposta.

Vou escrever pra Sun.

meus Deus que revoltadx,

Credo… 8O

no papel e na caneta:

3 / 2 = 1 resta 1

segundo o universo dos inteiros, ou tu achas q isso num existe na matematica pura?

ps.: se pra esclarecer sua dúvida não interessa o que o java faz, entaum meu nobre amigo, vc postou a dúvida no tópico errado! (JAVA AVANÇADO)

o que o fabiostb esta certo, 3 / 2 = 1 resta 1, uma divisao entre inteiros resulta em um inteiro, na matematica, em Java e em C, teste esse codigo:

#include <stdio.h>
int main(){
 double x;
 x = 3 / 2;
 printf("%f\n", x);
 return 0;
}

o resultado vai ser esse:

1.000000