Подтвердить что ты не робот

Как проверить, не имеет ли десятичная запятая двойное значение

У меня есть двойное значение, которое я должен отображать в своем пользовательском интерфейсе. Теперь условие состоит в том, что десятичное значение double = 0, например. - 14,0 В этом случае я должен показать только 14 в своем интерфейсе. Кроме того, максимальный предел для символов здесь равен 5.

например, 12.34, целочисленное значение может быть не более двух цифр, и поэтому это десятичное значение для нашего двойного.

Каким может быть лучший способ сделать это?

4b9b3361

Ответ 1

Вы могли бы просто сделать это: d % 1 == 0, чтобы увидеть, является ли какой-то double d целым.

Ответ 2

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

Ответ 3

Все целые числа по модулю 1. Таким образом, ниже проверка должна дать вам ответ.

if(d % 1 == 0)

Ответ 4

либо пол и пол должны давать одинаковый выход

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

Ответ 5

Сравните два значения: нормальный двойной и двойной после floor. Если они имеют одинаковое значение, то нет десятичной составляющей.

Ответ 6

Используйте формат форматирования для форматирования значения, если требуется. Проверьте это.

Ответ 7

Вы, вероятно, захотите округлить до пяти десятичных знаков или так до сравнения, так как 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/

Ответ 8

Интересная небольшая проблема. Это немного сложно, поскольку реальные числа, а не всегда представляют собой точные целые числа, даже если они предназначены, поэтому важно допускать допуски.

Например, допуск может быть 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));
}