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

问题描述:

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

+1

没有办法“优雅地”这样做,因为float和double是按大小和位模式完全不同的数据类型。所以显而易见的方法是唯一的方法。 – 2010-01-07 10:05:53

基本上东西必须做每个值的转换。这两个数组类型之间没有隐式转换,因为在JITting之后用于处理它们的代码会有所不同 - 它们具有不同的元素大小,并且float将需要转换,而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; 
} 
+0

你也可以使它成为扩展方法。 – Seth 2011-10-27 05:54:00

+3

@Seth:这是Java,而不是C#。 – 2011-10-27 05:58:25

+0

您可以将其命名为'convertToDoubles'或'toDoubles'并为其他原始(和盒装)类型提供重载。 – 2015-01-18 08:45:00

您是否确实需要将您的float数组复制到双数组?如果您在使用浮点时遇到编译器和类型问题,您可以使用此...

float x = 0; 
double d = Double.valueOf(x); 

通过复制获得什么优势?如果您需要更高精度的基于浮点数的计算结果,请使结果为double。我可以看到有很多缺点,有数组副本,并执行复制功能,特别是如果它很大。确保你真的需要这样做。

HTH

+1

我看到一个非常明显的原因:当您在float []中有数据时调用一个需要'double []'的方法。 – 2010-01-07 10:03:40

+0

很明显,但OP没有提到这一点。我只是想提供一个替代方案,因为他要求。 – Simon 2010-01-07 10:14:17

+0

Andreas_D解释它。我需要让两个图书馆互相玩耍。然后其中一个使用double []向量,另一个使用float [](数学意义上的向量)。 Java与铸造数组的麻烦,匹配这些库并不那么简单。 似乎没有任何解决方案,而不需要遍历数组。谢谢回复。 – fifigyuri 2010-01-07 14:38:37

在Java 8就可以了,如果你真的想,做:

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

但它更好(更清洁,更快,更好的语义)使用乔恩斯基特的功能。

+0

我不买Jon Skeet的更好。事实上,这个可以更快地进行优化并且并行完成。很明显发生了什么,可能会变成(double [])floatArray的功能等价物。使用流的原因是它告诉编译器我们不关心它是如何完成的或按照什么顺序,只需将所有这些值映射到这些其他值即可。而不是在外部循环。 – Tatarize 2017-10-22 23:37:16