Ответ 1
Вы могли бы просто сделать это: d % 1 == 0
, чтобы увидеть, является ли какой-то double d
целым.
У меня есть двойное значение, которое я должен отображать в своем пользовательском интерфейсе. Теперь условие состоит в том, что десятичное значение double = 0, например. - 14,0 В этом случае я должен показать только 14 в своем интерфейсе. Кроме того, максимальный предел для символов здесь равен 5.
например, 12.34, целочисленное значение может быть не более двух цифр, и поэтому это десятичное значение для нашего двойного.
Каким может быть лучший способ сделать это?
Вы могли бы просто сделать это: d % 1 == 0
, чтобы увидеть, является ли какой-то double d
целым.
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");
Все целые числа по модулю 1. Таким образом, ниже проверка должна дать вам ответ.
if(d % 1 == 0)
либо пол и пол должны давать одинаковый выход
Math.ceil(x.y) == Math.floor(x.y)
или просто проверьте равенство с двойным значением
x.y == Math.ceil(x.y)
x.y == Math.floor(x.y)
или
Math.round(x.y) == x.y
Сравните два значения: нормальный двойной и двойной после floor
. Если они имеют одинаковое значение, то нет десятичной составляющей.
Используйте формат форматирования для форматирования значения, если требуется. Проверьте это.
Вы, вероятно, захотите округлить до пяти десятичных знаков или так до сравнения, так как double может содержать очень маленькие десятичные части, если вы сделали с ним некоторые вычисления.
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
Если вы используете С++, я не думаю, что существует функция round-function, поэтому вы должны реализовать ее самостоятельно, как в: http://www.cplusplus.com/forum/general/4011/
Интересная небольшая проблема. Это немного сложно, поскольку реальные числа, а не всегда представляют собой точные целые числа, даже если они предназначены, поэтому важно допускать допуски.
Например, допуск может быть 1E-6, в модульных тестах я придерживался довольно грубой толерантности, чтобы иметь более короткие номера.
Ни один из ответов, которые я могу читать, теперь работает таким образом, поэтому вот мое решение:
public boolean isInteger(double n, double tolerance) {
double absN = Math.abs(n);
return Math.abs(absN - Math.round(absN)) <= tolerance;
}
И unit test, чтобы убедиться, что он работает:
@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));
}