Ciekawy mały problem. Jest to nieco trudne, ponieważ liczby rzeczywiste nie zawsze oznaczają dokładne liczby całkowite, nawet jeśli mają na to wpływ, więc ważne jest, aby pozwolić na tolerancję.
Na przykład tolerancja może wynosić 1E-6, w testach jednostkowych zachowałem dość grubą tolerancję na krótsze numery.
Żadna z odpowiedzi, które mogę czytać obecnie pracuje w ten sposób, więc tu jest moje rozwiązanie:
public boolean isInteger(double n, double tolerance) {
double absN = Math.abs(n);
return Math.abs(absN - Math.round(absN)) <= tolerance;
}
A testy jednostkowe, aby upewnić się, że działa:
@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));
}
to Double.MIN_VALUE% 1 == 0 daje fałsz –
@Evgeniy Przecież 'Double.MIN_VALUE' nie jest w całości. –
+1 Jesteś dobry –