Thú vị chút vấn đề. Đó là một chút khó khăn, kể từ số thực, không phải lúc nào cũng đại diện cho các số nguyên chính xác, ngay cả khi chúng có nghĩa là, vì vậy điều quan trọng là để cho phép một sự khoan dung.
Ví dụ khoan dung có thể là 1E-6, trong các bài kiểm tra đơn vị, tôi giữ một dung sai khá thô để có số ngắn hơn.
Không ai trong số các câu trả lời mà tôi có thể đọc hiện đang làm việc theo cách này, vì vậy đây là giải pháp của tôi:
public boolean isInteger(double n, double tolerance) {
double absN = Math.abs(n);
return Math.abs(absN - Math.round(absN)) <= tolerance;
}
Và kiểm tra đơn vị, để đảm bảo nó hoạt động:
@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));
}
Double.MIN_VALUE% 1 == 0 này cho false –
@Evgeniy Sau khi tất cả, 'Double.MIN_VALUE' không phải là toàn bộ. –
+1 bạn là người nghiêm khắc –