如何在Java中将浮点数数组转换为双精度浮点数数组?

24

我有一个浮点数数组,希望在Java中将其转换为双精度数组。我知道通过迭代数组并创建新数组的明显方式。我期望Java能够平滑地处理float[] 并希望使用double[]...但它无法处理。

有什么优雅有效的方法可以进行此转换吗?


1
没有“优雅”地完成这个任务的方法,因为浮点数和双精度浮点数在大小和位模式上是完全不同的数据类型。所以显而易见的方法就是唯一的方法。 - Thorsten S.
3个回答

31

基本上,需要某个东西来转换每个值。两种数组类型之间没有隐式转换,因为在 JIT 后处理它们的代码将是不同的 - 它们具有不同的元素大小,并且 float 需要进行转换,而 double 则不需要。与引用类型的数组协变相比,在读取数据时不需要进行任何转换(例如,对于 String 引用和 Object 引用,位模式相同),并且所有引用类型的元素大小相同。

简而言之,在循环中需要进行转换。我不知道是否有内置方法可以做到这一点。我相信它们存在于某些第三方库中,但除非您已经在使用其中一个库,否则我会建议编写自己的方法。为了方便起见,这里提供一个示例实现:

public static double[] convertFloatsToDoubles(float[] input)
{
    if (input == null)
    {
        return null; // Or throw an exception - your choice
    }
    double[] output = new double[input.length];
    for (int i = 0; i < input.length; i++)
    {
        output[i] = input[i];
    }
    return output;
}

你也可以将其制作为扩展方法。 - Seth
你可以将其命名为convertToDoublestoDoubles,并为其他基本类型(和装箱类型)提供重载。 - Aleksandr Dubinsky
1
在Java中似乎没有便捷的方法来实现这个......而且似乎也没有任何库有这个的实现......太棒了! - Chase

12

在Java 8中,如果您真的想要,您可以执行以下操作:

IntStream.range(0, floatArray.length).mapToDouble(i -> floatArray[i]).toArray();

使用Jon Skeet的函数会更好(更清晰、更快、更好的语义),但这并不意味着原来的函数有什么问题。


2
我不相信Jon Skeet的方法更好。事实上,这个方法可以进行更快的优化和并行处理。它很清晰地说明了正在发生的事情,并且很可能被转换为(double[])floatArray的功能等效形式。使用流的原因是告诉编译器我们不关心它是如何完成或以什么顺序完成的,只需将所有这些值映射到其他值即可,而不是在外部循环遍历它们。 - Tatarize

0
你是否真的需要将浮点数数组复制到双精度数组中?如果在使用浮点数时遇到编译器和类型问题,可以尝试使用以下方法...
float x = 0;
double d = Double.valueOf(x);

复制数组有什么优势?如果您需要在基于浮点数的计算结果中获得更高的精度,则将结果设置为double。我可以看到拥有数组副本和执行复制函数的许多缺点,特别是如果它很大。确保您真的需要这样做。

希望对您有所帮助


2
我看到一个非常明显的原因:当你的数据是float[]类型时,调用需要double[]类型的方法。 - Andreas Dolk
显然,但是OP没有提到这一点。我只是想提供一个替代方案,因为他要求了。 - Simon
Andreas_D 解释了这个问题。我需要让两个库相互配合。其中一个使用 double[] 向量,另一个使用 float[](在数学意义下的向量)。Java 在进行数组转换时存在麻烦,使得匹配这些库并不简单。似乎没有任何解决方案可以避免循环数组的需要。感谢回复。 - fifigyuri
Double.valueOf [可能会] 实例化一个对象。使用简单的强制转换即可。 - Aleksandr Dubinsky
@AleksandrDubinsky 你甚至不需要显式转换:float f = 0; double d = f; 就可以正常工作。 - Dmitry Avtonomov

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