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));
}