如何在Java中将浮点数组转换为双精度数组?
Posted
技术标签:
【中文标题】如何在Java中将浮点数组转换为双精度数组?【英文标题】:How to convert array of floats to array of doubles in Java? 【发布时间】:2011-01-02 10:12:34 【问题描述】:我有一个浮点数组,我想将它转换为 Java 中的双精度数组。我知道迭代数组并创建一个新数组的明显方式。我希望 Java 能够在希望使用 double[] 的地方顺利消化 float[] ......但它不能使用这个。 进行这种转换的优雅、有效的方法是什么?
【问题讨论】:
没有办法“优雅”地做到这一点,因为 float 和 double 在大小和位模式上是完全不同的数据类型。所以显而易见的方法是唯一的。 【参考方案1】:基本上something 必须对每个值进行转换。两种数组类型之间没有隐式转换,因为在 JITting 之后用于处理它们的代码会有所不同——它们具有不同的元素大小,并且 float 需要转换,而 double 则不需要。将此与引用类型的数组协方差进行比较,其中读取数据时不需要转换(例如,字符串引用的位模式与对象引用相同)并且元素大小对于所有引用类型都是相同的。
简而言之,something 必须循环执行转换。我不知道有任何内置方法可以做到这一点。我确定它们存在于某个地方的第三方库中,但除非您碰巧已经在使用其中一个库,否则我只会编写您自己的方法。为方便起见,这里有一个示例实现:
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;
【讨论】:
你也可以把它变成一个扩展方法。 您可以将其命名为convertToDoubles
或 toDoubles
并为其他原始(和盒装)类型提供重载。
Java 中似乎没有为此提供方便的方法....而且似乎没有任何库具有此实现....啊-mazing!【参考方案2】:
在 Java 8 中,如果你真的愿意,你可以这样做:
IntStream.range(0, floatArray.length).mapToDouble(i -> floatArray[i]).toArray();
但使用 Jon Skeet 的函数会更好(更简洁、更快、更好的语义)。
【讨论】:
我不认为 Jon Skeet 的更好。事实上,这个可以更快地优化和并行完成。很清楚正在发生什么,很可能会变成 (double[]) floatArray 的功能等价物。使用流的原因是它告诉编译器我们不在乎它是如何完成的或以什么顺序,只需将所有这些值映射到其他值。而不是在外部循环它们。【参考方案3】:您真的需要将浮点数组复制到双精度数组吗?如果您在使用浮点数时遇到编译器和类型问题,您可以使用这个...
float x = 0;
double d = Double.valueOf(x);
复制有什么好处?如果您需要基于浮点数的计算结果更精确,则将结果设为double
。我可以看到拥有数组副本并执行复制功能的很多缺点,尤其是在它很大的情况下。确保您确实需要这样做。
HTH
【讨论】:
我看到一个非常明显的原因:调用需要double[]
的方法,而您的数据位于 float[]
中。
显然,但 OP 没有提到这一点。我只是想提供一个替代方案,因为他要求。
Andreas_D 解释了它。我需要制作两个库来互相玩。然后其中一个使用 double[] 向量,另一个使用 float[] (数学意义上的向量)。 Java 在转换数组时遇到麻烦,匹配这些库并不是那么简单。似乎不存在任何不需要遍历数组的解决方案。感谢您的回复。
Double.valueOf
[可能] 实例化一个对象。使用简单的演员表。
@AleksandrDubinsky 你甚至不需要明确的演员表:float f = 0; double d = f;
工作得很好以上是关于如何在Java中将浮点数组转换为双精度数组?的主要内容,如果未能解决你的问题,请参考以下文章
在控制浮点数精度的同时在javascript中将数组转换为字符串