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

fif*_*uri 20 java type-conversion

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

Jon*_*eet 30

基本上什么需要做的每一个值的转换.两种数组类型之间没有隐式转换,因为在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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Seth:这是Java,而不是C#. (3认同)

Ale*_*sky 7

在Java 8中,如果您真的想,可以:

IntStream.range(0, floatArray.length).mapToDouble(i -> floatArray[i]).toArray();
Run Code Online (Sandbox Code Playgroud)

但是使用Jon Skeet的功能更好(更干净,更快,更好的语义).

  • 我不认为乔恩·斯基特的更好。事实上,这一优化可以更快地并行完成。很清楚发生了什么,很可能会变成 (double[]) floatArray 的功能等效项。使用流的原因是它告诉编译器我们不关心它是如何完成的或按什么顺序完成的,只需将所有这些值映射到其他值即可。而不是在外部循环它们。 (2认同)