Как проверить, является ли 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
}
Я знаю, что код, вероятно, не похож, но как он идет?
Ответы
Ответ 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
}