web-dev-qa-db-fra.com

Convertir double en tableau int

J'ai un double 

double pi = 3.1415;

Je veux convertir ceci en un tableau int

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

Je suis venu avec ça

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

Cela fonctionne mais je n'aime pas cette solution car je pense qu'un grand nombre de conversions entre types de données peut entraîner des erreurs. Mon code est-il complet ou dois-je vérifier quelque chose d'autre?

Et comment aborderiez-vous ce problème?

28
Ian Fako

Je ne sais pas directement mais je pense que c'est plus simple:

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

Puisque vous voulez éviter les conversions, voici la méthode arithmétique, en supposant que vous n’ayez à traiter que des nombres positifs:

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

Le traitement des nombres négatifs peut être facilement effectué en vérifiant d'abord le signe puis en utilisant le même code avec current = Math.abs(pi).

Notez qu'en raison de l'arithmétique à virgule flottante, vous obtiendrez des résultats inattendus pour les valeurs qui ne peuvent pas être parfaitement représentées en binaire.

Voici une idée qui illustre le problème et où vous pouvez essayer mon code.

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

Ou une approche plus sûre avec Java-9:

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

Vous pouvez utiliser en Java 8

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

cela fonctionnerait aussi

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