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?
Vous pouvez simplement faire ceci: d % 1 == 0
pour voir si certains double d
est entier.
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");
Tous les nombres entiers sont modulo de 1. Donc, ci-dessous, la vérification doit vous donner la réponse.
if(d % 1 == 0)
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
Comparez deux valeurs: le double normal et le double après floor
ing. S'ils ont la même valeur, il n'y a pas de composant décimal.
Utilisez le formateur de nombres pour formater la valeur, si nécessaire. S'il vous plaît vérifier this .
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));
}
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/