Подтвердить что ты не робот

Как преобразовать массив float в массив парных чисел в Java?

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

4b9b3361

Ответ 1

В основном что-то должно делать преобразование каждого значения. Не существует неявного преобразования между двумя типами массивов, потому что код, используемый для их обработки после JITting, будет другим - у них есть другой размер элемента, и для float потребуется преобразование, тогда как double не будет. Сравните это с ковариацией массива для ссылочных типов, где при чтении данных не требуется преобразований (например, шаблон бит одинаковый для ссылки на String в качестве ссылки на объект), а размер элемента одинаковый для всех ссылочных типов.

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

НТН