Conversione da Long a Double in Java


93

C'è un modo per convertire un Longtipo di dati in Doubleo double?

Ad esempio, devo convertire 15552451Lin un doubletipo di dati.

Risposte:


137

Potresti semplicemente fare:

double d = (double)15552451L;

Oppure potresti ottenere il doppio dall'oggetto lungo come:

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

6
Non è necessario analizzare le stringhe lì: Long.valueOf(15552451L).doubleValue()se vuoi passare tramite Long. Nota che questo è lo stesso, internamente, del cast di a double, tranne per il fatto che stai facendo un po 'di auto / unboxing.
Joe Kearney

4
L'ho fatto. L'analisi di una stringa per eseguire questa operazione (ora modificata dalla risposta) ridurrà le prestazioni di molti ordini di grandezza. La boxe è meno costosa ma vale comunque la pena evitarla, specialmente in casi come questo (utilizzo new) dove non può essere elusa.
Joe Kearney

Penso che l'esempio avrebbe dovuto mostrare che puoi ottenere da Long -> double. Come il tempo è stato inizializzato non sembra così importante ..
AMS

1
Certo, l'esempio nella risposta sembra più ragionevole ora che è stato modificato. Ritengo che la conversione da un valore a un doppio tramite una stringa non sia una buona pratica. Avrei pensato che fosse abbastanza incontrovertibile.
Joe Kearney

1
Non è necessario eseguire il cast esplicitamente. Funziona e basta:double d = 15552451L;
cutemachine

20

Casting semplice?

double d = (double)15552451L;

E se è solo letterale15552451d
Jon Freedman

2
Penso anche che un cast non sia necessario, puoi creare un double con un valore lungo come questo: "double d = 1234L;".
crusam

Probabilmente no, ma la domanda è abbastanza basilare da giustificare l'introduzione di un concetto come il casting.
Jim Brissom

9

Come già accennato, puoi semplicemente lanciare long per raddoppiare. Ma fai attenzione con la conversione da long a double perché long to double è una conversione restrittiva in java.

La conversione dal tipo double al tipo long richiede una conversione non banale da un valore a virgola mobile a 64 bit alla rappresentazione intera a 64 bit. A seconda del valore effettivo del tempo di esecuzione, le informazioni potrebbero andare perse.

es. il programma seguente stamperà 1 non 0

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

4

Stai cercando la conversione binaria?

double result = Double.longBitsToDouble(15552451L);

Questo ti darà doublelo stesso schema di bit del longletterale.

I letterali binari o esadecimali torneranno utili, qui. Ecco alcuni esempi.

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

(Vedi Double.longBitsToDouble (long) )

Puoi anche ottenere la longschiena con

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

(Vedi Double.doubleToRawLongBits (double) )


Questo fa qualcos'altro, vedi jdoc ( docs.oracle.com/javase/6/docs/api/java/lang/… )
Jiri Kremser

Sì. Ma lui non ha specificato come vuole convertire longa double(credo casting è una delle prime cose che si imparano quando si utilizza Java) né ha accettare qualsiasi risposta. Forse vuole ottenere un doublecon lo stesso schema di bit del longvalore. Beh, non lo so. Quindi ho solo dato la risposta.
pvorb

Ho aggiunto ulteriori informazioni, quindi la risposta è più preziosa.
pvorb

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

In questo modo possiamo convertire il tipo Long in Double o Float o Int senza alcun problema perché è facile convertire il valore della stringa in Double o Float o Int.


2
È sempre meglio aggiungere una spiegazione al codice che stai pubblicando come risposta, in modo che aiuti i visitatori a capire perché questa è una buona risposta.
abarisone

1

Cosa intendi per appuntamento lungo tipo di ?

Puoi lanciare un long a un doppio:

double d = (double) 15552451L;

Immagino che una lunga data sarebbe qualcosa come "Martedì 19 settembre 24893243092333".
Teemu Leisti

1

Puoi provare qualcosa di simile:

long x = somevalue;

double y = Double.longBitsToDouble(x);

0

Penso che ti faccia bene.

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

Che ne dici di questo codice? : D

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.