Перетворення з Long на Double на Java


93

Чи є спосіб перетворити Longтип даних на Doubleабо double?

Наприклад, мені потрібно перетворити 15552451Lна doubleтип даних.

Відповіді:


136

Ви можете просто зробити:

double d = (double)15552451L;

Або ви можете отримати подвійний об'єкт Long як:

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

6
Не потрібно ніякого синтаксичного розбору там: Long.valueOf(15552451L).doubleValue()якщо ви хочете пройти Long. Зауважте, що це внутрішньо те ж саме, що і акторський склад double, за винятком того, що ви робите авто / розпакування.
Joe Kearney

4
Я зробив. Розбір рядка для цього (тепер відредагований з відповіді) призведе до погіршення продуктивності на багато порядків. Бокс є менш дорогим, але його все-таки варто уникати, особливо у таких випадках (із використанням new), коли його неможливо уникнути.
Joe Kearney

Я думаю, що приклад мав показати, що ви можете отримати від Long -> double. Те, як було ініційовано Довгий, здається не таким важливим ..
ams

1
Звичайно, приклад у відповіді виглядає більш розумним, відредагований. Я стверджую, що перетворення значення у подвійне за допомогою рядка не є доброю практикою. Я б подумав, що це досить суперечливо.
Joe Kearney

1
Вам не потрібно чітко проводити кастинг. Це просто працює:double d = 15552451L;
cutemachine

20

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

double d = (double)15552451L;

І якщо це буквально просто15552451d
Джон Фрідман

2
Я навіть думаю, що кидок не потрібен, ви можете створити дубль з довгим значенням, як це: "double d = 1234L;".
crusam

Можливо, ні - але питання є досить елементарним, щоб виправдати запровадження такої концепції, як кастинг.
Jim Brissom,

9

Як вже зазначалося, ви можете просто кинути довго, щоб подвоїти. Але будьте обережні з довгим подвійним перетворенням, оскільки довге подвоєння - це звуження перетворення в 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назад з

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

(Див. Double.doubleToRawLongBits (double) )


Це робить щось інше, див. Jdoc ( docs.oracle.com/javase/6/docs/api/java/lang/… )
Іржі Кремсер

Так. Але він не уточнив , як він хоче , щоб перетворити longв double(я думаю , лиття одна з перших речей , які ви дізнаєтеся при використанні Java) і він не приймає жодної відповіді. Можливо, він хоче отримати a doubleз тим самим бітовим шаблоном, що і longзначення. Ну, я не знаю. Тож я просто дав відповідь.
pvorb

Я додав додаткову інформацію, тому відповідь є ціннішою.
pvorb

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

Таким чином ми можемо без проблем перетворити довгий тип на Double або Float або Int, оскільки перетворити значення рядка на Double або Float або Int легко.


2
Завжди краще додати пояснення до коду, який ви публікуєте як відповідь, щоб це допомогло відвідувачам зрозуміти, чому це хороша відповідь.
абарізон

1

Що ви маєте на увазі під типом довгого побачення ?

Ви можете кинути лог на дубль:

double d = (double) 15552451L;

Я думаю, що довге побачення було б щось на зразок "вівторок, 19 вересня 24893243092333".
Teemu Leisti

1

Ви можете спробувати щось подібне:

long x = somevalue;

double y = Double.longBitsToDouble(x);

0

Я думаю, це добре для вас.

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

Як щодо цього коду? : D

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.