Конвертировать double в массив int - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть двойной

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

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

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

Ответы [ 6 ]

0 голосов
/ 14 сентября 2018

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

        double pi           = 3.1415;
        String temp         = ""+ pi;
        String str          = "";
        String validChars   = "0123456789";

        //this removes all non digit characters 
        //so '.' and '+' and '-' same as string replace(this withThat)
        for(int i =0; i<temp.length(); i++){
          if(validChars.indexOf(temp.charAt(i)) > -1 ){
              str = str +temp.charAt(i);
          }
        }

        int[] result = new int[str.length()];

        for(int i =0; i<str.length(); i++){
          result[i] = Integer.parseInt(""+str.charAt(i));
          System.out.print(result[i]);
        }

        return result; //your array of ints
0 голосов
/ 14 сентября 2018

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

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).

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

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

0 голосов
/ 14 сентября 2018

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

int[] piArray = piString.chars().map(c -> c-'0').toArray();
0 голосов
/ 14 сентября 2018

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

int[] piArray = piString.chars().map(Character::getNumericValue).toArray();
0 голосов
/ 14 сентября 2018
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();
0 голосов
/ 14 сентября 2018

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

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