如何测试double是否为整数

JXP*_*nix 146 java math

是否有可能做到这一点?

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
}
Run Code Online (Sandbox Code Playgroud)

我知道代码可能不会去这样的事情,但怎么去了?

Sko*_*eet 196

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

(d % 1) == 0

  • 在计算方面,它是否比`Math.rint(d)`更快? (3认同)
  • 我真的很喜欢这个解决方案的简单性。它既易于阅读又易于实施。 (2认同)
  • 是的,这很好,但请注意,这是一个 Java 解决方案,并没有明确定义 C 和 C++ 中的负 `d`。 (2认同)
  • 在Sonar中,这产生了一个问题"不应该使用浮点值进行等式测试". (2认同)

max*_*hud 133

if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // integer type
}
Run Code Online (Sandbox Code Playgroud)

这将检查double的向下舍入值是否与double相同.

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

如果变量的值是无穷大或负无穷大,这也不起作用,因此在条件中添加"只要变量不是无限的".

  • "如果参数是NaN或无穷大或正零或负零,那么结果与参数相同." http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html#floor%28double%29 (3认同)
  • @TimSchmelter:好抓.同样值得注意的是NaN不等于任何东西(包括它自己),但是+/- Inf等于它自己 - 所以有两个边缘情况! (2认同)

Lou*_*man 81

番石榴:DoubleMath.isMathematicalInteger.(披露:我写过它.)或者,如果你还没有进口番石榴,x == Math.rint(x)那么这是最快的方法; rintfloor或者快得多ceil.

  • 不知道Math.rint你是对的.它比Math.floor快 (2认同)

Eng*_*uad 19

public static boolean isInt(double d)
{
    return d == (int) d;
}
Run Code Online (Sandbox Code Playgroud)


She*_*don 6

试试这个方法

public static boolean isInteger(double number){
    return Math.ceil(number) == Math.floor(number); 
}
Run Code Online (Sandbox Code Playgroud)

例如:

Math.ceil(12.9) = 13; Math.floor(12.9) = 12;
Run Code Online (Sandbox Code Playgroud)

因此12.9整数,不过

 Math.ceil(12.0) = 12; Math.floor(12.0) =12; 
Run Code Online (Sandbox Code Playgroud)

因此12.0是整数


小智 6

最好的方法是使用模数运算符

if(val % 1 == 0)
Run Code Online (Sandbox Code Playgroud)


Nit*_*ish 6

这是一个很好的解决方案:

if (variable == (int)variable) {
    //logic
}
Run Code Online (Sandbox Code Playgroud)

  • @xdavidliu 没必要。我们可以忽略它。 (2认同)