Konwersja z Long na Double w Javie

93

Czy istnieje sposób na przekonwertowanie Longtypu danych na Doublelub double?

Na przykład muszę przekonwertować 15552451Lna doubletyp danych.

Złupić
źródło

Odpowiedzi:

137

Możesz po prostu zrobić:

double d = (double)15552451L;

Lub możesz uzyskać podwójne z obiektu Long jako:

Long l = new Long(15552451L);
double d = l.doubleValue();
YoK
źródło
6
Nie potrzeba tam żadnego parsowania ciągów: Long.valueOf(15552451L).doubleValue()jeśli chcesz przejść przez Long. Zauważ, że wewnętrznie jest to to samo, co rzut z a double, z wyjątkiem tego, że wykonujesz pewne automatyczne / rozpakowywanie.
Joe Kearney,
4
Zrobiłem. Przetwarzanie ciągu w tym celu (teraz usunięte z odpowiedzi) obniży wydajność o wiele rzędów wielkości. Boks jest tańszy, ale nadal warto go unikać, szczególnie w takich przypadkach (używanie new), w których nie można go wyeliminować.
Joe Kearney,
Myślę, że przykład miał pokazać, że można uzyskać od Long -> double. Jak długo został zainicjowany nie wydaje się, że ważne ..
AMS
1
Przyznaję, że przykład w odpowiedzi wygląda bardziej rozsądnie, ponieważ został zredagowany. Uważam, że konwersja z wartości na podwójną za pomocą ciągu znaków nie jest dobrą praktyką. Myślałem, że to raczej niekontrowersyjne.
Joe Kearney,
1
Nie musisz rzucać jawnie. Po prostu działa:double d = 15552451L;
cutemachine
20

Proste odlewanie?

double d = (double)15552451L;
Jim Brissom
źródło
A jeśli to dosłownie po prostu15552451d
Jon Freedman,
2
Myślę nawet, że rzut nie jest konieczny, możesz utworzyć sobowtór o długiej wartości w ten sposób: "double d = 1234L;".
crusam
Prawdopodobnie nie - ale pytanie jest na tyle podstawowe, że uzasadnia wprowadzenie koncepcji takiej jak casting.
Jim Brissom,
9

Jak już wspomniano, możesz po prostu rzucać długo, aby podwoić. Ale bądź ostrożny z długo podwójnej konwersji, ponieważ długo podwójne jest konwersja zwężenie w Javie.

Konwersja z typu double na typ long wymaga nietrywialnego tłumaczenia z 64-bitowej wartości zmiennoprzecinkowej na reprezentację 64-bitowej liczby całkowitej. W zależności od rzeczywistej wartości czasu wykonywania informacje mogą zostać utracone.

np. następujący program wypisze 1 a nie 0

    long number = 499999999000000001L;
    double converted = (double) number;
    System.out.println( number - (long) converted);
Głęboki
źródło
4

Szukasz konwersji binarnej?

double result = Double.longBitsToDouble(15552451L);

To da ci ten doublesam wzór bitowy co longdosłowny.

Przydadzą się tutaj literały binarne lub szesnastkowe. Oto kilka przykładów.

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

(Zobacz Double.longBitsToDouble (long) )

Możesz także dostać z longpowrotem za pomocą

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

(Zobacz Double.doubleToRawLongBits (double) )

pvorb
źródło
To robi coś innego, zobacz jdoc ( docs.oracle.com/javase/6/docs/api/java/lang/… )
Jiri Kremser
Tak. Ale on nie określił jak chce przekonwertować longdo double(chyba odlew jest jedną z pierwszych rzeczy, które uczą się przy użyciu języka Java) ani nie ponosi żadnej odpowiedzi. Może chce otrzymać doubletaki sam wzór bitów jak longwartość. No nie wiem. Więc po prostu udzieliłem odpowiedzi.
pvorb
Dodałem dodatkowe informacje, więc odpowiedź jest cenniejsza.
pvorb
3
Long i = 1000000;
String s = i + "";
Double d = Double.parseDouble(s);
Float f = Float.parseFloat(s);

W ten sposób możemy bez problemu przekonwertować typ Long na Double, Float lub Int, ponieważ łatwo jest przekonwertować wartość ciągu na Double lub Float lub Int.

Manav Patadia
źródło
2
Zawsze lepiej jest dodać wyjaśnienie do kodu, który publikujesz jako odpowiedź, aby pomóc odwiedzającym zrozumieć, dlaczego jest to dobra odpowiedź.
abarisone
1

Co masz na myśli przez długi typ daty ?

Możesz rzucić długie na podwójne:

double d = (double) 15552451L;
Joe Kearney
źródło
Wydaje mi się, że długa data to coś w rodzaju „wtorek, 19 września 24893243092333”.
Teemu Leisti
1

Możesz spróbować czegoś takiego:

long x = somevalue;

double y = Double.longBitsToDouble(x);
Vikas
źródło
0

Myślę, że to jest dobre dla ciebie.

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

A co z tym kodem? :RE

spearkkk
źródło