これを行うことは可能ですか?
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行くのでしょうか?
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
// integer type
}
これは、doubleの切り捨てられた値がdoubleと同じかどうかを確認します。
変数はintまたはdouble値を持つことができ、Math.floor(variable)
は常にint値を持つため、変数がMath.floor(variable)
と等しい場合は、int値を持つ必要があります。
これは、変数の値が無限または負の無限である場合にも機能しないため、「変数が無限でない限り」を条件に追加します。
または、モジュロ演算子を使用できます。
(d % 1) == 0
グアバ: DoubleMath.isMathematicalInteger
。 (開示:私はそれを書きました。)あるいは、もしあなたがまだGuavaをインポートしていないなら、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はnot integerです。
Math.ceil(12.0) = 12; Math.floor(12.0) =12;
したがって、12.は整数です
考慮してください:
Double.isFinite (value) && Double.compare (value, StrictMath.rint (value)) == 0
これはコアJavaに固執し、浮動小数点値(==
)の等価比較を回避します。 isFinite()
は無限値をパススルーするため、rint()
が必要です。
上記のSkonJeetの回答に似ていますが、パフォーマンスは優れています(少なくともJavaで)。
Double zero = 0d;
zero.longValue() == zero.doubleValue()
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);
}
良い解決策は次のとおりです。
if ((bool)(variable == (int)variable)) {
//logic
}
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();
この方法で試すことができます: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として)に割り当てることができます。
最善の方法は、モジュラス演算子を使用することです
if(val % 1 == 0)
個人的には、受け入れられた答えの中で単純なモジュロ演算ソリューションを好みます。残念ながら、SonarQubeは、ラウンド精度を設定せずに浮動小数点を使用した等値テストを好まない。そこで、より準拠したソリューションを見つけようとしました。ここにあります:
if (new BigDecimal(decimalValue).remainder(new BigDecimal(1)).equals(BigDecimal.ZERO)) {
// no decimal places
} else {
// decimal places
}
Remainder(BigDecimal)
は、値が(this % divisor)
であるBigDecimal
を返します。これがゼロに等しい場合、浮動小数点がないことがわかります。