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

Как проверить, является ли double целым числом

Можно ли это сделать?

double variable;
variable = 5;
/* the below should return true, since 5 is an int. 
if variable were to equal 5.7, then it would return false. */
if(variable == int) {
    //do stuff
}

Я знаю, что код, вероятно, не похож, но как он идет?

4b9b3361

Ответ 1

if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // integer type
}

Это проверяет, совпадает ли округленное значение двойника с двойным.

Ваша переменная может иметь значение int или double, а Math.floor(variable) всегда имеет значение int, поэтому, если ваша переменная равна Math.floor(variable), тогда она должна иметь значение int.

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

Ответ 2

Или вы можете использовать оператор modulo:

(d % 1) == 0

Ответ 3

Гуава: DoubleMath.isMathematicalInteger. (Раскрытие: я написал это.) Или, если вы еще не импортируете Guava, x == Math.rint(x) - это самый быстрый способ сделать это; rint измеряется быстрее, чем floor или ceil.

Ответ 4

public static boolean isInt(double d)
{
    return d == (int) d;
}

Ответ 5

Попробуйте этот путь,

public static boolean isInteger(double number){
    return Math.ceil(number) == Math.floor(number); 
}

например:

Math.ceil(12.9) = 13; Math.floor(12.9) = 12;

следовательно 12.9 не целое число, тем не менее

 Math.ceil(12.0) = 12; Math.floor(12.0) =12; 

следовательно 12.0 - целое число

Ответ 6

Как и в SkonJeet, ответьте выше, но производительность лучше (по крайней мере, в java):

Double zero = 0d;    
zero.longValue() == zero.doubleValue()

Ответ 7

Рассмотрим:

Double.isFinite (value) && Double.compare (value, StrictMath.rint (value)) == 0

Это относится к ядру Java и позволяет избежать сравнения равенств между значениями с плавающей запятой (==), который скомпрометирован. isFinite() необходимо, поскольку rint() будет передавать значения бесконечности.

Ответ 8

public static boolean isInteger(double d) {
  // Note that Double.NaN is not equal to anything, even itself.
  return (d == Math.floor(d)) && !Double.isInfinite(d);
}

Ответ 9

Здесь версия для Integer и Double:

    private static boolean isInteger(Double variable) {
    if (    variable.equals(Math.floor(variable)) && 
            !Double.isInfinite(variable)          &&
            !Double.isNaN(variable)               &&
            variable <= Integer.MAX_VALUE         &&
            variable >= Integer.MIN_VALUE) {
        return true;
    } else {
        return false;
    }
}

Чтобы преобразовать Double в Integer:

Integer intVariable = variable.intValue();

Ответ 10

вы можете попробовать таким образом: получить целочисленное значение double, вычесть это из исходного двойного значения, определить диапазон округления и проверить, больше ли абсолютное число нового двойного значения (без целочисленной части) или меньше вашего определенного диапазона. если он меньше, вы можете предполагать, что это целочисленное значение. Пример:

public final double testRange = 0.2;

public static boolean doubleIsInteger(double d){
    int i = (int)d;
    double abs = Math.abs(d-i);
    return abs <= testRange;
}

Если вы присваиваете d значение 33.15, метод возвращает true. Чтобы получить лучшие результаты, вы можете назначить более низкие значения testRange (как 0,0002) по своему усмотрению.

Ответ 11

Лично я предпочитаю простое решение по модулю в принятом ответе. К сожалению, SonarQube не любит тесты равенства с плавающими точками без установки округлой точности. Поэтому мы попытались найти более подходящее решение. Вот он:

if (new BigDecimal(decimalValue).remainder(new BigDecimal(1)).equals(BigDecimal.ZERO)) {
    // no decimal places
} else {
    // decimal places
}

Remainder(BigDecimal) возвращает a BigDecimal, значение которого (this % divisor). Если он равен нулю, мы знаем, что нет плавающей запятой.

Ответ 12

Лучший способ с оператором модуля

if(val % 1 == 0)

Ответ 13

Легко сравнивая его с самим собой, приведенным к целому числу

if ( x == (int) x )

Ответ 14

Вот хорошее решение:

if ((bool)(variable == (int)variable)) {
    //logic
}

Ответ 15

Здесь решение:

float var = Your_Value;
if ((var - Math.floor(var)) == 0.0f)
{
    // var is an integer, so do stuff
}