89 votes

Comment vérifier si une valeur double n'a pas de partie décimale ?

J'ai une valeur double que je dois afficher sur mon interface utilisateur. Maintenant, la condition est que la valeur décimale du double = 0, par exemple - 14.0. Dans ce cas, je ne dois afficher que 14 sur mon interface utilisateur. De plus, la limite maximale des caractères est de 5 ici.

Par exemple, 12.34. La valeur entière ne peut être supérieure à deux chiffres, tout comme la valeur décimale de notre double.

Quelle serait la meilleure façon de procéder ?

1voto

Floaf Points 145

Vous voudrez probablement arrondir le double à 5 décimales environ avant de le comparer, car un double peut contenir de très petites parties décimales si vous avez effectué des calculs avec lui.

double d = 10.0;
d /= 3.0; // d should be something like 3.3333333333333333333333...
d *= 3.0; // d is probably something like 9.9999999999999999999999...

// d should be 10.0 again but it is not, so you have to use rounding before comparing

d = myRound(d, 5); // d is something like 10.00000
if (fmod(d, 1.0) == 0)
  // No decimals
else
  // Decimals

Si vous utilisez C++, je ne pense pas qu'il existe une fonction ronde, vous devez donc l'implémenter vous-même comme dans : http://www.cplusplus.com/forum/general/4011/

1voto

stivlo Points 28997

Petit problème intéressant. Il est un peu délicat, car les nombres réels ne représentent pas toujours des entiers exacts, même s'ils sont censés le faire, il est donc important de prévoir une tolérance.

Par exemple, la tolérance pourrait être 1E-6, dans les tests unitaires, j'ai gardé une tolérance plutôt grossière pour avoir des nombres plus courts.

Aucune des réponses que je peux lire actuellement ne fonctionne de cette manière, voici donc ma solution :

public boolean isInteger(double n, double tolerance) {
    double absN = Math.abs(n);
    return Math.abs(absN - Math.round(absN)) <= tolerance;
}

Et le test unitaire, pour s'assurer qu'il fonctionne :

@Test
public void checkIsInteger() {
    final double TOLERANCE = 1E-2;
    assertThat(solver.isInteger(1, TOLERANCE), is(true));

    assertThat(solver.isInteger(0.999, TOLERANCE), is(true));
    assertThat(solver.isInteger(0.9, TOLERANCE), is(false));

    assertThat(solver.isInteger(1.001, TOLERANCE), is(true));
    assertThat(solver.isInteger(1.1, TOLERANCE), is(false));

    assertThat(solver.isInteger(-1, TOLERANCE), is(true));

    assertThat(solver.isInteger(-0.999, TOLERANCE), is(true));
    assertThat(solver.isInteger(-0.9, TOLERANCE), is(false));

    assertThat(solver.isInteger(-1.001, TOLERANCE), is(true));        
    assertThat(solver.isInteger(-1.1, TOLERANCE), is(false));
}

0voto

Sudhanshu Umalkar Points 3660

Utilisez le formateur de nombres pour formater la valeur, selon les besoins. Veuillez vérifier ce .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X