A maneira mais rápida de determinar o valor decimal é inteiro em java
Pergunta
Dada uma variável dupla nomeada sizeValue
e sizeValue
contém algo diferente de 0, qual é a maneira mais eficiente de determinar que sizeValue
Contém um valor que é um número inteiro?
Atualmente estou usando
sizeValue % 1 == 0
Algum outro caminho mais rápido?
Solução
experimentar Math.CEIL:
private static boolean isInt(double x) {
return x == Math.ceil(x);
}
EDITAR
Eu fiz alguns benchmarks com os seguintes métodos:
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
é o mais rápido deles (em um Sunjre 1.6)
Outras dicas
Não tenho certeza se é mais rápido, mas você pode lançar o seu dobro para um INT e testar a igualdade:
double d = 123.456;
boolean dIsAnInteger = (d == (int)d);
Aviso: você consideraria 0.9999999999999999
um número inteiro? Provavelmente não. Mas observe isso:
double val = 0;
for(int i=0;i<10;i++)
System.out.println(val+=0.1);
Isso imprime:
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
O que é problemático porque no final do programa val
Contém algo que você acha que deve ser inteiro, mas não é.
Então, eu tornaria meu método um pouco mais lento (mas mais correto), integrando um delta como Junit faz:
private static boolean isInt(double x, double delta) {
double ceil = Math.ceil(x);
return x-delta<ceil && x+delta>ceil;
}
E, é claro, forneça o mesmo método com um padrão sensato:
private static boolean isInt(double x) {
return isInt(x, 0.000000001);
}
Agora isInt(val)
finalmente retorna verdadeiro.