web-dev-qa-db-ja.com

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
}

私はコードがおそらくそのようなことをしないことを知っていますが、どのようにdoes行くのでしょうか?

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

これは、doubleの切り捨てられた値がdoubleと同じかどうかを確認します。

変数はintまたはdouble値を持つことができ、Math.floor(variable)は常にint値を持つため、変数がMath.floor(variable)と等しい場合は、int値を持つ必要があります。

これは、変数の値が無限または負の無限である場合にも機能しないため、「変数が無限でない限り」を条件に追加します。

122
maxhud

または、モジュロ演算子を使用できます。

(d % 1) == 0

182
SkonJeet

グアバ: DoubleMath.isMathematicalInteger 。 (開示:私はそれを書きました。)あるいは、もしあなたがまだGuavaをインポートしていないなら、x == Math.rint(x)がそれをする最も速い方法です; rintは、floorまたはceilよりもかなり高速です。

78
Louis Wasserman
public static boolean isInt(double d)
{
    return d == (int) d;
}
18
Eng.Fouad

この方法を試して、

public static boolean isInteger(double number){
    return Math.ceil(number) == Math.floor(number); 
}

例えば:

Math.ceil(12.9) = 13; Math.floor(12.9) = 12;

したがって、12.9not integerです。

 Math.ceil(12.0) = 12; Math.floor(12.0) =12; 

したがって、12.は整数です

4
Sheldon

考慮してください:

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

これはコアJavaに固執し、浮動小数点値(==)の等価比較を回避します。 isFinite()は無限値をパススルーするため、rint()が必要です。

2
simon.watts

上記のSkonJeetの回答に似ていますが、パフォーマンスは優れています(少なくともJavaで)。

Double zero = 0d;    
zero.longValue() == zero.doubleValue()
2
edwardsayer
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);
}
1
maerics

良い解決策は次のとおりです。

if ((bool)(variable == (int)variable)) {
    //logic
}
1
Nitish

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

DoubleIntegerに変換するには:

Integer intVariable = variable.intValue();
1
irudyak

この方法で試すことができます:doubleの整数値を取得し、元のdouble値からこれを減算し、丸め範囲を定義し、新しい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として)に割り当てることができます。

0
Salvi94

最善の方法は、モジュラス演算子を使用することです

 if(val % 1 == 0)
0

個人的には、受け入れられた答えの中で単純なモジュロ演算ソリューションを好みます。残念ながら、SonarQubeは、ラウンド精度を設定せずに浮動小数点を使用した等値テストを好まない。そこで、より準拠したソリューションを見つけようとしました。ここにあります:

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

Remainder(BigDecimal)は、値が(this % divisor)であるBigDecimalを返します。これがゼロに等しい場合、浮動小数点がないことがわかります。

0
chaeschuechli