BigInteger: compter le nombre de chiffres après la virgule dans une méthode évolutive

J'ai besoin de compter le nombre de chiffres après la virgule d'un BigInteger. Par exemple:

  • 99 retourne 2
  • 1234 retourne 4
  • 9999 retourne 4
  • 12345678901234567890 retourne 20

J'ai besoin pour ce faire pour un BigInteger avec 184948 chiffres décimaux et plus. Comment puis-je faire rapide et évolutive?

La convertir en Chaîne de approche est lente:

public String getWritableNumber(BigInteger number) {
   //Takes over 30 seconds for 184948 decimal digits
   return "10^" + (number.toString().length() - 1);
}

Ce boucle-diviser par dix approche est d'autant plus lente:

public String getWritableNumber(BigInteger number) {
    int digitSize = 0;
    while (!number.equals(BigInteger.ZERO)) {
        number = number.divide(BigInteger.TEN);
        digitSize++;
    }
    return "10^" + (digitSize - 1);
}

Existe-il des méthodes plus rapides?

La lenteur est-il et à quelle vitesse avez-vous besoin?
Le plus rapide des 2 prend plus de 30 secondes pour un certain nombre de 184948 chiffres après la virgule. J'ai besoin d'elle à moins de 2 secondes.
2 secondes? Cela sonne un peu comme la limite de temps d'une programmation de la concurrence.
Il y a quelques belles twiddles pour ce faire, essayez de ici pour commencer. Peuvent ne pas s'appliquer à BigInteger.
Avec Goyave, c'est le one-liner BigIntegerMath.log10(x, RoundingMode.FLOOR) + 1. Goyave utilise plusieurs astuces présentées ici.

OriginalL'auteur Geoffrey De Smet | 2013-09-16