2010-01-07 105 views
18

我有一個浮點數組,我想將它轉換爲Java中的雙精度數組。我知道迭代數組並創建一個新數組的明顯方式。我期望Java在希望使用double []的情況下順利地消化float [],但它不能用於此。 做這種轉換的優雅,有效的方法是什麼?如何將浮點數組轉換爲Java中的雙精度數組?

+1

沒有辦法「優雅地」這樣做,因爲float和double是按大小和位模式完全不同的數據類型。所以顯而易見的方法是唯一的方法。 – 2010-01-07 10:05:53

回答

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; 
} 
+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

1

您是否確實需要將您的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

7

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

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

但它更好(更清潔,更快,更好的語義)使用喬恩斯基特的功能。

+0

我不買Jon Skeet的更好。事實上,這個可以更快地進行優化並且並行完成。很明顯發生了什麼,可能會變成(double [])floatArray的功能等價物。使用流的原因是它告訴編譯器我們不關心它是如何完成的或按照什麼順序,只需將所有這些值映射到這些其他值即可。而不是在外部循環。 – Tatarize 2017-10-22 23:37:16

相關問題