Comment vérifier si un double a au plus n décimales?

Actuellement, j'ai cette méthode:

static boolean checkDecimalPlaces(double d, int decimalPlaces){
    if (d==0) return true;

    double multiplier = Math.pow(10, decimalPlaces); 
    double check  =  d * multiplier;
    check = Math.round(check);      
    check = check/multiplier; 
    return (d==check);      
}

Mais cette méthode n'est pas pour checkDecmialPlaces(649632196443.4279, 4) probablement parce que je fais de la base de 10 les mathématiques sur une base de 2 numéro.

Alors, comment cela peut-il vérifier être fait correctement?

J'ai pensé à l'obtention d'une représentation de chaîne de la valeur double, puis vérifier avec une regexp - mais que me sentais bizarre.

EDIT:
Merci pour toutes les réponses. Il y a des cas où j'ai vraiment obtenir un double et pour les cas j'ai mis en place les éléments suivants:

private static boolean checkDecimalPlaces(double d, int decimalPlaces) {
    if (d == 0) return true;

    final double epsilon = Math.pow(10.0, ((decimalPlaces + 1) * -1));

    double multiplier = Math.pow(10, decimalPlaces);
    double check = d * multiplier;
    long checkLong = (long) Math.abs(check);
    check = checkLong / multiplier;

    double e = Math.abs(d - check);
    return e < epsilon;
}

J'ai changé le round à une troncature. Semble que le calcul fait dans round augmente l'imprécision de trop. Au moins dans le défaut testcase.

Comme certains de vous l'ont souligné, si je pouvais obtenir la 'vraie' entrée de chaîne que je devrais utiliser BigDecimal de vérifier et j'ai donc fait:

BigDecimal decimal = new BigDecimal(value);
BigDecimal checkDecimal = decimal.movePointRight(decimalPlaces);
return checkDecimal.scale() == 0;

La double valeur que je reçois vient de Apache POI API qui lit les fichiers excel. J'ai fait quelques tests et constaté que, bien que l'API retourne double valeurs numériques des cellules que je peux obtenir une représentation exacte quand j'ai immédiatement format double avec le DecimalFormat:

DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumIntegerDigits(Integer.MAX_VALUE);
//don't use grouping for numeric-type cells
decimalFormat.setGroupingUsed(false);
decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
value = decimalFormat.format(numericValue);

Cela fonctionne aussi pour les valeurs qui ne peuvent pas être représentés exactement dans le format binaire.

"correctement" ne veut pas dire grand-chose ici. Vos aléatoire des nombres décimaux n'ont pas exact des représentations binaires. Vous êtes à la recherche pour un nombre décimal qui est "assez proche" de sorte que des gens comme les décimales version de la valeur binaire. Comment fermer est assez proche?

OriginalL'auteur Turismo | 2008-11-05