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

时间:2009-10-15 21:02:53

标签: java primitive

如果名为sizeValue的双变量和sizeValue包含0以外的其他变量,那么确定sizeValue包含整数值的最有效方法是什么?

目前我正在使用

sizeValue%1 == 0

还有其他更快捷的方式吗?

3 个答案:

答案 0 :(得分: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比他们更快(在太阳1.6上)

答案 1 :(得分:3)

我不确定它是否更快,但您可以将您的double转换为int并测试相等性:

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

答案 2 :(得分: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。