如何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)。
这里是Integer
和Double
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 }