8

sizeValueという名前のdouble 変数sizeValueに 0 以外の値がsizeValue含まれている場合、値が整数であると判断する最も効率的な方法は何ですか?

現在、私は使用しています

sizeValue % 1 == 0

他のより速い方法はありますか?

4

3 に答える 3

6

Math.ceilを試してみてください:

private static boolean isInt(double x) {
     return x == Math.ceil(x);
}

編集

次の方法でいくつかのベンチマークを実行しました。

private static boolean isInt1(double x) {
    return x == (int) x;
}

private static boolean isInt2(double x) {
    return x == Math.ceil(x);
}

private static boolean isInt3(double x) {
    return x % 1 == 0;
} 

isInt1それらの中で高速です(sunjre 1.6で)

于 2009-10-15T21:10:35.747 に答える
3

それがより速いかどうかはわかりませんが、 double を int にキャストして、等しいかどうかをテストできます。

double d = 123.456;
boolean dIsAnInteger = (d == (int)d);
于 2009-10-15T21:10:44.830 に答える
1

警告:0.9999999999999999整数を考慮しますか? おそらくそうではありません。しかし、これを見てください:

double val = 0;
for(int i=0;i<10;i++)
    System.out.println(val+=0.1);

これは出力します:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

プログラムの最後に、val整数であるべきだと思うがそうではないものが含まれているため、これは問題です。

したがって、 JUnitのようにデルタを統合することで、メソッドを少し遅くします (ただし、より正確にします) 。

private static boolean isInt(double x, double delta) {
    double ceil = Math.ceil(x);
    return x-delta<ceil && x+delta>ceil;
}

もちろん、賢明なデフォルトで同じメソッドを提供します。

private static boolean isInt(double x) {
    return isInt(x, 0.000000001);
}

isInt(val)最終的に true を返すようになりました。

于 2010-02-25T05:44:30.363 に答える