题
给予双重命名的可变 sizeValue
和 sizeValue
包含其他东西比0,什么是最有效的方式确定 sizeValue
包含的价值,是一个整数?
目前我在用
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)
其他提示
我不知道这是否是任何更快,但你可以投你double到int和测试平等:
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)
最后返回正确的。
不隶属于 StackOverflow