Porque um float pode receber um long, mas não pode receber um double ?!
4 respostas
G
Gustavo_Santos
Pessoal, estou com uma dúvida boba aqui, e por esse motivo não posso passar
para o próximo capítulo do livro da Keity.
Sabemos que um float tem 32 bits, e que um long e um double tem 64.
portando, na minha concepção um float não deveria receber um long, mais ele recebe.
Contrapartida ele não recebe um double.
longlong64Bits=10;doubledouble64Bits=10;floatfloat32Bits=long64Bits;// aqui tudo bem ! porque ?!float32Bits=double64Bits;// aqui dá pau ! e porque aqui dá pau ?!
Preciso de uma esplicação, não só falar faz um cast que funfa… Isso é importânte, porque com isso também
se define qual método sobrecarregado a JVM chama.
O que muda nesses dois tipos (float, long) é a forma como
esses dois caras armazenam os seus bits que representam seu valor:
o resultado é :
explicando então…
ao se passar um long a um float, o Java utiliza os bits exponenciais do float para armazenar o calculo q atingirá o mesmo valor do long.
sendo assim: 9223372036854775807 eh exatamente igual a 9.223372 elevado a 18 exponencial.
Não é igual, Gustavo. A explicação do Miojo (de onde vc provavelmente copiou a sua) contém um erro.
9223372036854775807 é diferente de 9223372000000000000. Existe perda de precisão.
Widening primitive conversions do not lose information about the overall magnitude of a numeric value. Indeed, conversions widening from an integral type to another integral type do not lose any information at all; the numeric value is preserved exactly. Conversions widening from float to double in strictfp expressions also preserve the numeric value exactly; however, such conversions that are not strictfp may lose information about the overall magnitude of the converted value.
Ou seja, essa perda de precisão é permitida nesse tipo de conversão. Foi uma decisão de projeto, para a linguagem não te pentelhar tanto com casts. É uma perda de precisão menos significativa, pois ocorre em bits menos significativos, não nos mais, como ocorre com os downcasts.
Agora, vamos e venhamos, o número 36.854.775.807 não é um valor pequeno e dependendo do que você queria se referir, isso vai dar uma enorme dor de cabeça.