Java で 10 進数値が整数であることを確認する最も高速かつ効率的な方法

StackOverflow https://stackoverflow.com/questions/1575052

  •  21-09-2019
  •  | 
  •  

質問

という名前の double 変数を指定すると、 sizeValue そして sizeValue 0 以外のものが含まれています。それを判断する最も効率的な方法は何ですか? sizeValue 整数値が含まれていますか?

現在私が使用しているのは

サイズ値 % 1 == 0

他にもっと速い方法はありますか?

役に立ちましたか?

解決

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上)

他のヒント

それはどんな速い場合、私はわからないが、あなたは平等のためにint型とテストへのごdoubleをキャストすることができます:

double d = 123.456;
boolean dIsAnInteger = (d == (int)d);

警告:検討してみませんか 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 を返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top