Conversão de Long para Double em Java


91

Existe alguma maneira de converter um Longtipo de dados em Doubleou double?

Por exemplo, preciso converter 15552451Lpara um doubletipo de dados.

Respostas:


134

Você poderia simplesmente fazer:

double d = (double)15552451L;

Ou você pode obter o dobro do objeto Long como:

Long l = new Long(15552451L);
double d = l.doubleValue();

6
Não precisa de nenhuma análise de string lá: Long.valueOf(15552451L).doubleValue()se você quiser ir via Long. Observe que isso é o mesmo, internamente, que o elenco de a double, exceto que você está fazendo algum auto / unboxing.
Joe Kearney,

4
Eu fiz. Analisar uma string para fazer isso (agora editada da resposta) degradará o desempenho em muitas ordens de magnitude. O boxe é mais barato, mas vale a pena evitá-lo, especialmente em casos como este (uso new), onde não pode ser omitido.
Joe Kearney,

Acho que o exemplo deveria mostrar que você pode obter de Long -> double. Como o Long foi inicializado não parece tão importante ..
manhã,

1
Concedido, o exemplo na resposta parece mais razoável agora que foi editado. Afirmo que a conversão de um valor para um duplo por meio de uma String não é uma boa prática. Eu teria pensado que isso seria bastante incontroverso.
Joe Kearney,

1
Você não precisa lançar explicitamente. Simplesmente funciona:double d = 15552451L;
cutemachine

20

Elenco simples?

double d = (double)15552451L;

E se for literalmente15552451d
Jon Freedman,

2
Eu até acho que um elenco não é necessário, você pode criar um duplo com um valor longo assim: "double d = 1234L;".
crusam

Provavelmente não - mas a questão é básica o suficiente para justificar a introdução de um conceito como o casting.
Jim Brissom,

9

Como já foi mencionado, você pode simplesmente lançar long para dobrar. Mas tome cuidado com a conversão long to double porque long to double é uma conversão de estreitamento em java.

A conversão do tipo double para o tipo long requer uma tradução não trivial de um valor de ponto flutuante de 64 bits para a representação inteira de 64 bits. Dependendo do valor real do tempo de execução, as informações podem ser perdidas.

por exemplo, o programa a seguir imprimirá 1 não 0

    long number = 499999999000000001L;
    double converted = (double) number;
    System.out.println( number - (long) converted);

3

Você está procurando a conversão binária?

double result = Double.longBitsToDouble(15552451L);

Isso lhe dará o doublemesmo padrão de bits do longliteral.

Literais binários ou hexadecimais serão úteis aqui. Aqui estão alguns exemplos.

double nan = Double.longBitsToDouble(0xfff0000000000001L);
double positiveInfinity = Double.longBitsToDouble(0x7ff0000000000000L);
double positiveInfinity = Double.longBitsToDouble(0xfff0000000000000L);

(Consulte Double.longBitsToDouble (long) )

Você também pode pegar as longcostas com

long bits = Double.doubleToRawLongBits(Double.NaN);

(Consulte Double.doubleToRawLongBits (double) )


Isso faz outra coisa, consulte o jdoc ( docs.oracle.com/javase/6/docs/api/java/lang/… )
Jiri Kremser

Sim. Mas ele não especificou como ele quer converter longpara double(acho casting é uma das primeiras coisas que você aprende ao usar Java) nem ele aceitar qualquer resposta. Talvez ele queira obter um doublecom o mesmo padrão de bits do longvalor. Bem, eu não sei. Então eu apenas dei a resposta.
pvorb

Eu adicionei informações adicionais, então a resposta é mais valiosa.
pvorb

3
Long i = 1000000;
String s = i + "";
Double d = Double.parseDouble(s);
Float f = Float.parseFloat(s);

Desta forma, podemos converter o tipo Long em Double ou Float ou Int sem nenhum problema, porque é fácil converter o valor da string em Double ou Float ou Int.


2
É sempre melhor adicionar uma explicação ao código que você está postando como resposta, para que ajude os visitantes a entender por que essa é uma boa resposta.
abarisone

1

O que você quer dizer com tipo de data longa ?

Você pode lançar um longo para um duplo:

double d = (double) 15552451L;

Acho que uma data longa seria algo como "Terça-feira, 19 de setembro 24893243092333".
Teemu Leisti

0

Você pode tentar algo assim:

long x = somevalue;

double y = Double.longBitsToDouble(x);

0

Eu acho que é bom para você.

BigDecimal.valueOf([LONG_VALUE]).doubleValue()

Que tal este código? : D

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.