Как проверить, является ли double целым числом - PullRequest
138 голосов
/ 28 марта 2012

Возможно ли это сделать?

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
}

Я знаю, что код, вероятно, ничего подобного не делает, но как делает это происходит?

Ответы [ 14 ]

186 голосов
/ 28 марта 2012

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

(d % 1) == 0

126 голосов
/ 28 марта 2012
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // integer type
}

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

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

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

78 голосов
/ 28 марта 2012

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

18 голосов
/ 28 марта 2012
public static boolean isInt(double d)
{
    return d == (int) d;
}
4 голосов
/ 11 января 2016

Попробуйте следующим образом,

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 является целым числом

2 голосов
/ 04 октября 2017

Рассмотрим:

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

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

2 голосов
/ 08 марта 2017

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

Double zero = 0d;    
zero.longValue() == zero.doubleValue()
1 голос
/ 08 июля 2019

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

if ((bool)(variable == (int)variable)) {
    //logic
}
1 голос
/ 07 октября 2016

Вот версия для 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();
1 голос
/ 28 марта 2012
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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...