1

私はプログラミング初心者で、double が整数かどうかを返すメソッドが必要です。この問題は、数値が大きすぎて int が保持できない場合に発生します。

ここに私が持っているものがあります:

private static boolean isInteger(double n){
    int ni = (int) n;
    double nd = (double) ni;
    if (nd==n)
        return true;
    return false;
}

143215890634.0 のように入力したとします。int はそれほど多くの桁を格納できないため、false が返されます。

int(または別のクラス)がより多くの数字を格納できるようにするにはどうすればよいですか?または、このように比較せずにdoubleがintであるかどうかを判断するより良い方法はありますか?

前もって感謝します!

4

5 に答える 5

2

試す

boolean isInteger(double d) {
    return d % 1 == 0;
}
于 2013-04-13T16:28:52.633 に答える
2

Welllongは よりも多くの桁数を保持しますint。の範囲外になるまでにlongすべての double値は整数になります (そして 1 以上で区切られます)。したがって、次のようなものを使用できます。

private static boolean isInteger(double n) {
    if (n > (double) Long.MAX_VALUE ||  n < (double) Long.MIN_VALUE) {
        return true;
    }
    long asLong = (long) n;
    return n == (double) asLong;
}

ビット単位の表現を決定し、指数をチェックする代替アプローチがありますが、少なくとも理解するには、より複雑になります。

バイナリ浮動小数点の正確な値をチェックすることは、通常は悪い考えであることに注意してください。代わりに、最も近い整数にどれだけ近いかを確認しdouble、何らかの許容範囲を持たせたい場合があります。

于 2013-04-13T16:12:34.307 に答える
0

と比較してくださいInteger.MAX_VALUE小さい場合は、分数がないと仮定して整数に収まります。

于 2013-04-13T16:11:16.067 に答える
0

型の昇格を回避するため、これは Math.round() よりもさらにうまく機能すると思います。

    double d1 = 143215890634.0, d2 = 143215890634.001;
    System.out.println(d1 == Math.floor(d1));
    System.out.println(d2 == Math.floor(d2));

これは、「整数」で実際の型「int」を意味するのではなく、「小数点以下の位置のない数値」を意味する場合に機能します。

于 2013-04-13T16:18:34.540 に答える