如何testing双精度是一个整数

是否有可能做到这一点?

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 } 

我知道代码可能不会像这样,但它是怎么回事?

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

这将检查double的舍入值是否与double相同。

你的variables可以有一个int或double值, Math.floor(variable)总是有一个int值,所以如果你的variables等于Math.floor(variable)那么它必须有一个int值。

如果variables的值是无限的或负的无穷大,那么这也不起作用,因此只要条件不变,只要variables不是无限的。

或者你可以使用模运算符:

(d % 1) == 0

番石榴: DoubleMath.isMathematicalInteger 。 (披露:我写了。)或者,如果你还没有import番石榴, x == Math.rint(x)是最快的方法; rint的速度比floor或者ceil快得多。

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

试试这个方法,

 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是整数

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

你可以这样试试:获得double的整数值,从原来的double值中减去它,定义一个舍入范围,并testing新的double值的绝对值(不包括整数部分)是大于还是小于你的定义的范围。 如果它更小,你可以打算它是一个整数值。 例:

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

如果你赋值为33.15,那么方法返回true。 为了获得更好的结果,您可以自行决定将较低的值分配给testRange(0.0002)。

这里是IntegerDouble Integer的一个版本:

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

类似于上面的SkonJeet的回答,但是性能更好(至less在java中):

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

就我个人而言,我更喜欢接受答案中的简单模运算解决scheme。 不幸的是,SonarQube不喜欢用浮点平均testing而不设置圆精度。 所以我们试图寻找更合适的解决scheme。 这里是:

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

Remainder(BigDecimal)返回值为(this % divisor)BigDecimal 。 如果这个等于零,我们知道没有浮点。

考虑:

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

这坚持核心Java,避免了浮点值( == )之间的平等比较糟糕。 isFinite()是必要的,因为rint()将传递无穷大值。

这是一个解决scheme:

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