Karas, eu nunca precisei disso… Mas e se eu quiser representar um valor inteiro maior que o limite de um long??? Q q eu faço??? Issu sem usar Wrappers(Integer, Long e talz).
use a classe BigDecimal
Dá uma olhada na classe java.math.BigInteger
vc pode usar o float e o double também para fazer isso.
Falo
blz… mas por meio de primitivos como int, double, float e talz num é possível né?
o double aguenta números maiores, mas você vai perder precisão porque ele vai converter em potência de dez até um certo limite de casas.
o double nao aguenta um numero maior nao… em C aguenta, mas em Java tando o long qnto o double sao de 64bits, e como o double ainda tem q registrar as casas decimais ele aguenta ateh menos…
use a classe BigInteger q vai suportar qquer numero q caiba na memoria 8O 8O 8O
Isso é uma coisa que eu sempre achei muito bizarra. Os primitivos long e double ambos têm 64 bits, mas double necessita de certos bits para as casas decimais, então o número de inteiros representáveis por um double é menor do que os representáveis por um long. O problema é que mesmo assim há um cast automático de long para double, o que contradiz a crença de que quando há possibilidade de perda de precisão é preciso um cast explícito:
double d;
long l = 34656345L;
d = l;
na verdade eles aguentam o mesmo numero …se nao usar virgulas
Bom galera,
Pelo que eu sei, tanto o long quanto o double são números de 64 bits, porém o limite do long, barra no limite de um número inteiro de 64 bits, ou seja, o maior número long possível será 9223372036854775807.
Já para o double, pelo fato de trabalhar com potência de 10, ele aguenta números muito maiores, claro que perderá um pouco a precisão, mas ele aguenta precisão de até 15 casas, o seu limite barra em 1,7E+308.
double db1=Long.MAX_VALUE;
db1=db1*Long.MAX_VALUE;
System.out.println(db1);
Isso é impossível. Seria necessário usar todos os 64 bits do double para representar um long*, e nesse caso onde seria armazenda a informação de se há ou não virgula? É simplesmente impossível.
*Editado: estava float.
Só para provar que é impossível colocar qualquer inteiro em uma variável de ponto flutuante da mesma largura, ou seja, que é impossível converter de int para float ou de long para double sem perder precisão:
public class Test {
public static void main (String[] args) {
int i1; // int original
float f; // float obtido a partir de int1
int i2; // int obtido a partir de f
System.out.println("Perda de precisão: ");
for (i1 = Integer.MIN_VALUE; i1 <= Integer.MAX_VALUE; i1++) {
f = i1;
i2 = (int)f;
if (i1 != i2) {
System.out.println("((float)" + i1 + " == " + f + ") ((int)" + f + " == " + i2 + ")");
}
}
}
}
Esse código irá mostrar em quais valores ocorre perda de precisão na conversão de int para float.