it-swarm.com.ru

Конвертировать double в массив int

У меня двойник 

double pi = 3.1415;

Я хочу преобразовать это в массив int

int[] piArray = {3,1,4,1,5};

Я придумал это

double pi = 3.1415;
String piString = Double.toString(pi).replace(".", "");
int[] piArray = new int[piString.length()];
for (int i = 0; i <= piString.length()-1; i++)
   piArray[i] = piString.charAt(i) - '0'; 

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

И как бы вы подошли к этой проблеме?

28
Ian Fako

Я не знаю прямой путь, но я думаю, что это проще:

int[] piArray = String.valueOf(pi)
                      .replaceAll("\\D", "")
                      .chars()
                      .map(Character::getNumericValue)
                      .toArray();
23
Rahim Dastar

Поскольку вы хотите избежать приведений, вот арифметический способ, предполагающий, что вам нужно иметь дело только с положительными числами:

List<Integer> piList = new ArrayList<>();
double current = pi;
while (current > 0) {
    int mostSignificantDigit = (int) current;
    piList.add(mostSignificantDigit);
    current = (current - mostSignificantDigit) * 10;
}

Обработку отрицательных чисел можно легко выполнить, сначала проверив знак, а затем используя тот же код с current = Math.abs(pi).

Обратите внимание, что из-за арифметики с плавающей запятой она даст вам результаты, которые вы можете не ожидать для значений, которые не могут быть полностью представлены в двоичном виде.

Здесь это идеон, который иллюстрирует проблему и где вы можете попробовать мой код.

14
Aaron
int[] result = Stream.of(pi)
            .map(String::valueOf)
            .flatMap(x -> Arrays.stream(x.split("\\.|")))
            .filter(x -> !x.isEmpty())
            .mapToInt(Integer::valueOf)
            .toArray();

Или более безопасный подход с Java-9:

 int[] result = new Scanner(String.valueOf(pi))
            .findAll(Pattern.compile("\\d"))
            .map(MatchResult::group)
            .mapToInt(Integer::valueOf)
            .toArray();
4
Eugene

Вы можете использовать в Java 8

int[] piArray = piString.chars().map(Character::getNumericValue).toArray();
3
Sveteek

это будет работать также

int[] piArray = piString.chars().map(c -> c-'0').toArray();
0
The Scientific Method