Как преобразовать массив чисел с плавающей точкой в ​​массив двойников в Java? - PullRequest
20 голосов
/ 07 января 2010

У меня есть массив с плавающей точкой, и я хотел бы преобразовать его в массив парных чисел в Java. Мне известен очевидный способ перебора массива и создания нового. Я ожидал, что Java будет легко переваривать float [] там, где он хочет работать с double [] ... но он не может с этим работать. Каков элегантный, эффективный способ сделать это преобразование?

Ответы [ 3 ]

30 голосов
/ 07 января 2010

В основном что-то должно выполнить преобразование каждого значения. Не существует неявного преобразования между двумя типами массивов, потому что код, используемый для их обработки после 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;
}
7 голосов
/ 18 января 2015

В Java 8 вы можете, если вы действительно хотите, сделать:

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

Но лучше (чище, быстрее, лучше семантика) использовать функцию Джона Скита.

1 голос
/ 07 января 2010

Вам действительно нужно скопировать массив с плавающей точкой в ​​двойной массив? Если у вас возникли проблемы с компилятором и типами при использовании чисел с плавающей запятой, вы можете использовать это ...

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

Какое преимущество вы получаете, взяв копию? Если вам нужна большая точность в результатах вычислений, основанных на числах с плавающей запятой, то получите результаты double. Я вижу много недостатков в том, чтобы иметь копию массива и выполнять функцию копирования, особенно если он большой. Убедитесь, что вам действительно нужно это сделать.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...