Chuyển đổi từ Dài sang Đôi trong Java


93

Có cách nào để chuyển đổi một Longkiểu dữ liệu sang Doublehoặc doublekhông?

Ví dụ, tôi cần chuyển đổi 15552451Lsang một doublekiểu dữ liệu.

Câu trả lời:


136

Bạn chỉ có thể làm:

double d = (double)15552451L;

Hoặc bạn có thể nhận được gấp đôi từ đối tượng Long như:

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

6
Không cần bất kỳ phân tích chuỗi nào ở đó: Long.valueOf(15552451L).doubleValue()nếu bạn muốn đi qua Long. Lưu ý rằng điều này giống nhau, nội bộ, giống như truyền từ a double, ngoại trừ việc bạn đang thực hiện một số thao tác tự động / mở hộp.
Joe Kearney

4
Tôi đã làm. Việc phân tích cú pháp một chuỗi để thực hiện việc này (hiện đã được chỉnh sửa khỏi câu trả lời) sẽ làm giảm hiệu suất theo nhiều cấp độ. Quyền anh ít tốn kém hơn nhưng vẫn đáng để tránh, đặc biệt là trong những trường hợp như thế này (sử dụng new) nơi nó không thể được giải quyết.
Joe Kearney,

Tôi nghĩ rằng ví dụ được cho là cho thấy rằng bạn có thể nhận được từ Long -> gấp đôi. Làm thế nào Long được khởi tạo dường như không quan trọng lắm ..
ams

1
Cho ví dụ trong câu trả lời trông hợp lý hơn bây giờ đã được chỉnh sửa. Tôi duy trì việc chuyển đổi từ một giá trị thành một giá trị kép thông qua một Chuỗi không phải là một phương pháp hay. Tôi đã nghĩ rằng điều đó là khá không thể kiểm soát.
Joe Kearney,

1
Bạn không cần phải truyền một cách rõ ràng. Nó chỉ hoạt động:double d = 15552451L;
cutemachine

20

Đúc đơn giản?

double d = (double)15552451L;

Và nếu một của nó theo nghĩa đen chỉ15552451d
Jon Freedman

2
Tôi thậm chí nghĩ rằng không cần thiết phải ép kiểu, bạn có thể tạo một đôi với giá trị dài như thế này: "double d = 1234L;".
crusham

Có thể là không - nhưng câu hỏi này đủ cơ bản để đảm bảo đưa ra một khái niệm giống như đúc.
Jim Brissom,

9

Như đã đề cập, bạn có thể chỉ cần truyền dài để tăng gấp đôi. Nhưng hãy cẩn thận với chuyển đổi dài thành kép vì dài thành gấp đôi là chuyển đổi thu hẹp trong java.

Việc chuyển đổi từ kiểu double sang kiểu long yêu cầu một bản dịch không nhỏ từ giá trị dấu phẩy động 64 bit sang biểu diễn số nguyên 64 bit. Tùy thuộc vào giá trị thời gian chạy thực tế, thông tin có thể bị mất.

Ví dụ: chương trình sau sẽ in 1 chứ không phải 0

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

4

Bạn đang tìm kiếm chuyển đổi nhị phân?

double result = Double.longBitsToDouble(15552451L);

Điều này sẽ cung cấp cho bạn doublevới cùng một mẫu bit như longnghĩa đen.

Các ký tự nhị phân hoặc thập lục phân sẽ có ích tại đây. Đây là một số ví dụ.

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

(Xem Double.longBitsToDouble (dài) )

Bạn cũng có thể lấy longlại bằng

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

(Xem Double.doubleToRawLongBits (double) )


Điều này thực hiện một cái gì đó khác, hãy xem jdoc ( docs.oracle.com/javase/6/docs/api/java/lang/… )
Jiri Kremser

Đúng. Nhưng anh ấy không nói rõ anh ấy muốn chuyển đổi thành như thế nào (tôi nghĩ ép kiểu là một trong những điều đầu tiên bạn học khi sử dụng Java) cũng như không chấp nhận bất kỳ câu trả lời nào. Có thể anh ta muốn nhận được một với cùng một mẫu bit với giá trị. Tôi không biết. Vì vậy, tôi chỉ đưa ra câu trả lời. longdoubledoublelong
pvorb

Tôi đã thêm thông tin bổ sung, vì vậy câu trả lời có giá trị hơn.
pvorb

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

Bằng cách này, chúng ta có thể chuyển đổi kiểu Long thành Double hoặc Float hoặc Int mà không gặp bất kỳ vấn đề gì vì rất dễ dàng chuyển đổi giá trị chuỗi thành Double hoặc Float hoặc Int.


2
Tốt hơn hết bạn nên thêm phần giải thích vào mã bạn đang đăng dưới dạng câu trả lời để giúp khách truy cập hiểu tại sao đây là câu trả lời hay.
abarisone

1

Ý bạn là gì về kiểu ngày dài ?

Bạn có thể truyền từ dài thành gấp đôi:

double d = (double) 15552451L;

Tôi đoán rằng một cuộc hẹn dài sẽ giống như "Thứ Ba, ngày 19 tháng 9 năm 24893243092333".
Teemu Leisti

1

Bạn có thể thử một cái gì đó như sau:

long x = somevalue;

double y = Double.longBitsToDouble(x);

0

Tôi nghĩ nó là tốt cho bạn.

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

Làm thế nào về mã này? : D

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.