在Java中确定整数的十进制值的最快最有效的方法是什么?

8

假设有一个名为sizeValue的双精度变量,且sizeValue中包含的值不是0,最有效的方法是确定sizeValue是否包含整数值?

目前我正在使用

sizeValue % 1 == 0

是否还有更快的方法?

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


Math.ceil更快吗?如果是,为什么?它做了什么神奇的事情呢? :-) - Adamski

3

我不确定这样是否更快,但你可以将double转换为int并测试其是否相等:

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

-1 不适用于2^31以外的数值。使用long类型仍然不太准确。 - starblue

1

警告:您会认为0.9999999999999999是一个整数吗?可能不是。但看看这个:

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

这将打印出:

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接