8

给定一个名为sizeValue并且sizeValue包含非 0 的双精度变量,确定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 回答