给定一个名为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 上)
我不确定它是否更快,但你可以将你的 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)
终于返回true。