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

如何在Java中将浮点数组转换为双精度数组?,java,type-conversion,Java,Type Conversion,我有一个浮点数组,我想在Java中将它转换为一个双精度数组。我知道迭代数组并创建新数组的明显方式。我希望Java能够在希望使用double[]的地方顺利地消化float[]。。。但这是行不通的。 进行这种转换的优雅而有效的方法是什么?基本上,每个值的转换都需要做一些事情。这两种数组类型之间没有隐式转换,因为在JITting之后用于处理它们的代码是不同的——它们具有不同的元素大小,浮点需要转换,而double则不需要。将此与引用类型的数组协方差进行比较,其中读取数据时不需要转换(例如,对于字符串引

我有一个浮点数组,我想在Java中将它转换为一个双精度数组。我知道迭代数组并创建新数组的明显方式。我希望Java能够在希望使用double[]的地方顺利地消化float[]。。。但这是行不通的。 进行这种转换的优雅而有效的方法是什么?

基本上,每个值的转换都需要做一些事情。这两种数组类型之间没有隐式转换,因为在JITting之后用于处理它们的代码是不同的——它们具有不同的元素大小,浮点需要转换,而double则不需要。将此与引用类型的数组协方差进行比较,其中读取数据时不需要转换(例如,对于字符串引用,位模式与对象引用相同),并且对于所有引用类型,元素大小都相同

简而言之,必须在循环中执行转换。我不知道有什么内置的方法可以做到这一点。我确信它们存在于某个第三方库中,但除非您碰巧已经在使用其中一个库,否则我只编写您自己的方法。为了方便起见,下面是一个示例实现:

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;
}
publicstaticdouble[]转换器floatstodoubles(float[]输入)
{
如果(输入==null)
{
返回null;//或引发异常-由您选择
}
double[]输出=新的double[input.length];
for(int i=0;i
您真的需要将浮点数组复制到双数组吗?如果在使用浮点时编译器和类型有问题,可以使用此

float x = 0;
double d = Double.valueOf(x);
复印一份有什么好处?如果您需要更高精度的基于浮点数的计算结果,请将结果
加倍。我可以看到,拥有阵列副本并执行复制功能有很多缺点,特别是如果它很大的话。确保你真的需要这样做


HTH

在Java 8中,如果您确实愿意,可以执行以下操作:

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

但是使用Jon Skeet的函数更好(更干净、更快、更好的语义)。

我看到一个非常明显的原因:调用一个需要
double[]
的方法,而您的数据在
float[]
中。显然,但OP没有提到这一点。我只是想给他一个选择,因为他提出了要求。我需要制作两个库来互相玩。其中一个用于双[]向量,另一个用于浮点[](数学意义上的向量)。Java在转换数组方面遇到了麻烦,匹配这些库并不是那么简单。似乎不存在不需要在阵列上循环的任何解决方案。感谢您的回复。
Double.valueOf
[可能]实例化一个对象。使用简单的强制转换。@AleksandrDubinsky您甚至不需要显式强制转换:
float f=0;双d=f工作得很好无法“优雅地”做到这一点,因为float和double在大小和位模式上是完全不同的数据类型。因此,显而易见的方法是唯一的。你也可以将其作为一个扩展方法。你可以将其命名为
convertToDoubles
toDoubles
,并为其他原语(和装箱)类型提供重载。java中似乎没有方便的方法来实现这一点……而且似乎没有任何库实现这一点……啊!我不认为乔恩·斯基特的更好。事实上,这一步可以更快地优化和并行完成。很清楚发生了什么,很可能会转化为(double[])floatArray的功能等价物。使用streams的原因是,它告诉编译器我们不关心它是如何完成的,也不关心它的顺序,只需要将所有这些值映射到其他值。而不是在外部循环。