Преобразование Long в Double в Java

93

Есть ли способ преобразовать Longтип данных вDouble или double?

Например, мне нужно преобразовать 15552451Lв doubleтип данных.

Гарри
источник

Ответы:

137

Вы могли просто сделать:

double d = (double)15552451L;

Или вы можете получить удвоение из объекта Long как:

Long l = new Long(15552451L);
double d = l.doubleValue();
ЙоК
источник
6
Здесь не нужен синтаксический анализ строк: Long.valueOf(15552451L).doubleValue()если вы хотите пройти через Long. Обратите внимание, что это внутренне то же самое, что и приведение из a double, за исключением того, что вы выполняете автоматическую / распаковку.
Джо Кирни
4
Я сделал. Анализ строки для этого (теперь удаленной из ответа) снизит производительность на много порядков. Бокс дешевле, но его все же стоит избегать, особенно в таких случаях (использование new), когда его невозможно избежать.
Джо Кирни
Думаю, пример должен был показать, что можно получить от Long -> double. Кажется, не так уж важно, как был инициализирован Long ..
AM
1
Конечно, после редактирования пример в ответе выглядит более разумным. Я утверждаю, что преобразование значения в двойное значение с помощью String не является хорошей практикой. Я бы подумал , что быть довольно спорными.
Джо Кирни
1
Приведение явно не требуется. Это просто работает:double d = 15552451L;
cutemachine
20

Простой кастинг?

double d = (double)15552451L;
Джим Бриссом
источник
И если это буквально15552451d
Джон Фридман
2
Я даже думаю, что приведение не требуется, вы можете создать двойное значение с длинным значением, например: «double d = 1234L;».
crusam
Вероятно, нет - но вопрос достаточно простой, чтобы оправдать введение такой концепции, как литье.
Джим Бриссом,
9

Как уже упоминалось, вы можете просто забросить лонг на удвоение. Но будьте осторожны с преобразованием long в double, потому что long to double - это сужающее преобразование в java.

Преобразование типа double в тип long требует нетривиального преобразования из 64-битного значения с плавающей запятой в 64-битное целочисленное представление. В зависимости от фактического значения времени выполнения информация может быть потеряна.

например, следующая программа напечатает 1, а не 0

    long number = 499999999000000001L;
    double converted = (double) number;
    System.out.println( number - (long) converted);
Глубокий
источник
4

Вы ищете двоичное преобразование?

double result = Double.longBitsToDouble(15552451L);

Это даст вам тот doubleже битовый шаблон, что и longлитерал.

Здесь пригодятся двоичные или шестнадцатеричные литералы. Вот несколько примеров.

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

(См. Double.longBitsToDouble (длинный) )

Вы также можете получить longобратно с

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

(См. Double.doubleToRawLongBits (double) )

пворб
источник
Это делает что-то еще, см. Jdoc ( docs.oracle.com/javase/6/docs/api/java/lang/… )
Иржи Кремсер
Да. Но он не уточнил , как он хочет , чтобы преобразовать longв double(я думаю , литье одна из первых вещей , которые вы узнаете при использовании Java) и он не принимает никакого ответа. Может быть, он хочет получить doubleс тем же битовым шаблоном, что и longзначение. Ну не знаю. Так что я просто дал ответ.
pvorb
Я добавил дополнительную информацию, поэтому ответ более ценен.
pvorb
3
Long i = 1000000;
String s = i + "";
Double d = Double.parseDouble(s);
Float f = Float.parseFloat(s);

Таким образом, мы можем без проблем преобразовать тип Long в Double, Float или Int, потому что строковое значение легко преобразовать в Double, Float или Int.

Манав Патадия
источник
2
Всегда лучше добавить объяснение к коду, который вы публикуете в качестве ответа, чтобы он помог посетителям понять, почему это хороший ответ.
abarisone 07
1

Что вы имеете в виду под длинным типом свидания ?

Вы можете забросить лонг на дубль:

double d = (double) 15552451L;
Джо Кирни
источник
Я предполагаю, что длинная дата будет чем-то вроде «Вторник, 19 сентября, 24893243092333».
Теему Лейсти
1

Вы можете попробовать что-то вроде этого:

long x = somevalue;

double y = Double.longBitsToDouble(x);
Викас
источник
0

Я думаю, это хорошо для тебя.

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

Как насчет этого кода? : D

Spearkkk
источник