web-dev-qa-db-fra.com

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

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

par exemple: 12,34, la valeur entière ne peut pas être supérieure à 2 chiffres, de même que la valeur décimale de notre double.

Quelle pourrait être la meilleure façon de faire cela?

67
Ankit

Vous pouvez simplement faire ceci: d % 1 == 0 pour voir si certains double d est entier.

190
Lone nebula
double d = 14.4;
if((d-(int)d)!=0)
    System.out.println("decimal value is there");
else
    System.out.println("decimal value is not there");
19

Tous les nombres entiers sont modulo de 1. Donc, ci-dessous, la vérification doit vous donner la réponse.

if(d % 1 == 0)
11
Gokul Nath KP

le plafond et le sol doivent donner la même chose

Math.ceil(x.y) == Math.floor(x.y)

ou tout simplement vérifier l'égalité avec une double valeur

x.y == Math.ceil(x.y)
x.y == Math.floor(x.y)

ou

Math.round(x.y) == x.y
7
Ankit

Comparez deux valeurs: le double normal et le double après flooring. S'ils ont la même valeur, il n'y a pas de composant décimal.

2
Patashu

Utilisez le formateur de nombres pour formater la valeur, si nécessaire. S'il vous plaît vérifier this .

1
Sudhanshu Umalkar

Intéressant petit problème. C'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 l'être. Il est donc important de permettre une tolérance.

Par exemple, la tolérance pourrait être 1E-6. Dans les tests unitaires, j'ai conservé une tolérance assez grossière pour avoir des nombres plus courts.

Aucune des réponses que je peux lire 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 vous assurer que cela 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));
}
1
stivlo

Avant de comparer, vous devez probablement arrondir le double à 5 décimales environ, puisqu'un double peut contenir de très petites parties décimales si vous avez effectué des calculs avec ce nombre.

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 round. Vous devez donc l'implémenter vous-même, comme dans: http://www.cplusplus.com/forum/general/4011/

1
Floaf