Java中Long类型转换为Double类型

109

有没有一种方法可以将 Long 数据类型转换为 Doubledouble

例如,我需要将 15552451L 转换为 double 数据类型。

8个回答

160

您可以简单地执行:

double d = (double)15552451L;

或者你可以通过Long对象获取double值,如下:

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

6
如果你想通过Long来实现,就不需要进行任何字符串解析:Long.valueOf(15552451L).doubleValue()。请注意,这与从double强制转换相同(在内部),除了你要进行一些自动/拆箱操作。 - Joe Kearney
4
我明白了。将字符串解析为此目的(现在已从答案中删除)会使性能降低数个数量级。装箱操作的成本较低,但仍然值得避免,特别是在这种情况下(使用“new”),因为它无法被省略。 - Joe Kearney
1
考虑到答案中的示例已经过编辑,现在看起来更合理了。我仍然坚持认为,通过字符串将一个值转换为 double 不是一个好的做法。我认为这应该是相当不受争议的。 - Joe Kearney
@jjk 如果您看一下问题,它确实提到了从Long(对象)转换为double。我不明白您对此持什么立场以及争议在哪里。 - YoK
1
你不需要显式地进行类型转换。它的工作原理是: double d = 15552451L; - cutemachine
显示剩余2条评论

24

简单的类型转换?

double d = (double)15552451L;

如果它是一个字面量,只需使用 15552451d - Jon Freedman
2
我甚至认为不需要强制转换,你可以像这样使用长整型创建一个双精度浮点数:"double d = 1234L;"。 - crusam
可能不是 - 但这个问题足够基础,值得引入像类型转换这样的概念。 - Jim Brissom

12

如前所述,您可以将长整型简单地转换为双精度浮点型。但要小心长整型到双精度浮点型的转换,因为在Java中,长整型到双精度浮点型是一种缩小转换

从双精度浮点类型向长整型类型的转换需要将64位浮点值转换为64位整数表示。根据实际运行时值,可能会丢失信息。

例如,以下程序将打印1而不是0:

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

3
你的链接显示相反的结果,即double to long是一种缩小转换,而long to double则是扩大转换。 - vpzomtrrfrt
1
严格来说,long->double 不是缩小转换,但这种转换仍然可能会失去精度:“将 int 或 long 值扩展为 float,或将 long 值扩展为 double 的转换可能会导致精度损失 - 也就是说,结果可能会失去一些最不重要的值位。在这种情况下,得到的浮点值将是整数值的正确舍入版本,使用 IEEE 754 最近舍入模式(§4.2.4)。“ https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2 - Antonio
(long) converted不是一个很好的答案示例,因为double -> long是一种缩小转换,根据定义,number - (long) converted并不总是等于0。https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3 - Antonio
@Antonio 好的。那么对于 int/long,精度是什么意思? - Sriman
@Sriman 请考虑以下示例。LONG和DOUBLE都有8个字节。但是,DOUBLE比LONG复杂得多,它具有尾数和指数部分,并且被解释不同,参见IEEE 754。因此,DOUBLE具有较少的值空间来表示整数。例如,499999999000000001L在DOUBLE中将无法准确表示(请参见我们评论的答案)。如果您关心精度,应使用BigDecimal将LONG值表示为浮点数。 - Antonio
显示剩余2条评论

5
你在寻找二进制转换吗?
double result = Double.longBitsToDouble(15552451L);

这将为您提供与提供的long具有相同位模式的double
二进制或十六进制字面量在这里会很方便。以下是一些示例。
double nan = Double.longBitsToDouble(0xfff0000000000001L);
double positiveInfinity = Double.longBitsToDouble(0x7ff0000000000000L);
double negativeInfinity = Double.longBitsToDouble(0xfff0000000000000L);

(查看 Double.longBitsToDouble(long)

你也可以使用以下方法获取 long

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

(查看 Double.doubleToRawLongBits(double))


这个做了另外一件事,请参考jdoc(http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#longBitsToDouble(long)) - Jiri Kremser
是的。但他没有指定如何将long转换为double(我认为在使用Java时,强制转换是你学习的第一件事之一),也没有接受任何答案。也许他想要一个与long值具有相同位模式的double。好吧,我不知道。所以我只是给出了答案。 - pvorb
我添加了额外的信息,所以答案更有价值。 - pvorb

2
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

1
你可以尝试像这样做:

long x = somevalue;

double y = Double.longBitsToDouble(x);

1

什么是“长日期”类型?

您可以将 long 强制转换为 double:

double d = (double) 15552451L;

我猜长日期可能是这样的:“24893243092333年9月19日,星期二”。 - Teemu Leisti

1

我认为这对你有好处。

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

这段代码怎么样? :D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接